Использование PrecompiledMvcEngine FindView выдает InvalidOperationException и ищет файлы View cshtml.

Я получил InvalidOperationException, когда контроллер MVC попытался выполнить FindView при использовании PrecompiledMvcEngine.

Использование на машине с VS2012, MVC4 и развернутой в IIS


person Zasz    schedule 20.02.2013    source источник


Ответы (1)


После просмотра исходного кода от ControllerBase.FindView до ViewEngineCollection.FindView до VirtualPathProviderViewEngine в PrecompiledMvcEngine , обнаружил, что счетчик _mappings в PrecompiledMvcEngine равен 0. (Передача в Reflection и с открытым исходным кодом.)

Причина в том, что в DLL моего проекта не было типа, назначаемого для WebPageRenderingBase. При декомпиляции моей dll у нее действительно были скомпилированные представления и представления, расширенные из WebPageRenderingBase.

После написания модульного теста, который делает то же самое, что PrecompiledMvcEngine делает для загрузки представлений, обнаружил, что они используют разные версии класса WebPageRenderingBase. RazorGenerator.Mvc использует System.Web.WebPages версии 1.0.0.0 для предварительной компиляции во время сборки. PrecompiledMvcEngine использует System.Web.WebPages версии 2.0.0.0 при загрузке типов из скомпилированной сборки. Исправлено это, изменив мой csproject MVC так, чтобы он также загружал v1.0.0.0 во время выполнения.

Измененный

 <Reference Include="System.Web.WebPages" />

который поднял 2.0.0.0 до

 <Reference Include="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

заставляя его всегда выбирать 1.0.0.0. Эта проблема часто возникает, если вы развертываете предварительно скомпилированные представления на машине с установленными VS2012 и MVC4, не указывая правильную версию в файле csproj.

person Zasz    schedule 20.02.2013