Внешняя область ASP.NET MVC 3 не компилируется во время выполнения (работает в Preview 1, но не RC)
Проблема
ASP.NET MVC 3 RC дает мне ошибку компиляции во время выполнения (при просмотре) во внешнюю область MVC. Сам сайт работает, но плагин отказывается загружать метаданные, связанные с неизвестной моделью.
LogOn.cshtml
@model TestProject.Models.LogOnModel
@{
View.Title = "Log On";
}
//.....omitted for brevity
Ошибка при запуске.
Compilation Error
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.
Compiler Error Message: CS0103: The name 'model' does not exist in the current context
Source Error:
Line 38: public override void Execute() {
Line 39:
Line 40: Write(model);
Line 41:
Line 42: WriteLiteral(" TestPlugin.Models.LogOnModel\r\n");
Фон
Веб-сайт представляет собой веб-сайт ASP.NET MVC 3 Preview 1, который я только что перенес в ASP.NET MVC 3 RC. Я прочитал заметки о выпуске и обновил их соответствующим образом, но все же столкнулся с проблемой с WebMatrix. Я нашел вопрос SO, в котором кто-то из команды MVC предположил, что до RTM мы используем следующее для принудительного вхождения пространств имен (я помещаю их в web.config, но это не сработало).
namespace WebMatrix.Data { class Foo { } }
namespace WebMatrix.WebData { class Foo { } }
Это решило мою проблему на веб-сайте, и веб-сайт теперь загружается в MVC 3 RC. Однако проблема заключается в внешней области MVC (отдельная сборка).
Примечание. Я не использую для этого сторонние библиотеки, я написал небольшую плагиновую структуру, которая позволяет загружать область MVC из другой сборки. Представления компилируются как встроенные ресурсы.
Итак, у меня есть плагин аутентификации, который выглядит так.
-Controllers
-- AccountController.cs
-Models
-- AccountModels.cs
-Views
--Account
--- LogOn.cshtml
--- ChangePassword.cshtml
--- ...
-Web.config
AccountAreaRegistration.cs
Web.config
Помимо того, что представления отмечены как встроенные ресурсы, AccountController, расширяющий PluginController, который знает, как загрузить встроенные resouces и удаляемый global.asax, является довольно стандартной областью MVC.
Я попытался создать новый пустой тестовый плагин MVC 3 и медленно добавить соответствующий код. Это гарантирует правильность всех ссылок и web.configs. Но я все еще получаю такую же модельную проблему, описанную выше. Проект компилируется во время разработки, но бросает проблему компиляции во время выполнения, когда он пытается отобразить просмотры, которые он просматривает.
Чтобы быть понятным, все это прекрасно работает в ASP.NET MVC 3 Preview 1. Однако теперь, когда я обновил его до MVC 3 RC, у меня работает основной веб-сайт, но внешняя область отказывается работать.
Нет ничего плохого в самой платформе плагина. Он отлично работает в MVC 3 Preview 1. Я ищу ответы, которые могут немного рассказать о том, что может произойти в MVC 3 RC, и почему я могу использовать эту ошибку модели.
Любые идеи?
Обновление
Интересно, если я изменил объявление модели в верхней части представления на синтаксис Preview 1, `@inherits System.Web.Mvc.WebViewPage
Я получаю другую ошибку компилятора во время выполнения. На этот раз я получаю сообщение об ошибке, когда Html.ValidationSummary начинается для формы входа.
@inherits System.Web.Mvc.WebViewPage<TestProject.Models.LogOnModel>
@{
View.Title = "Log On";
}
<div class="content_item half loginform">
<div class="content_body">
<h1>VastID Login</h1>
@Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.") // <=== Compilation issue here on Html.ValidationSummary
@using (Html.BeginForm())
{
// .. omitted for brevity
}
</div>
</div>
Compilation Error
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.
Compiler Error Message: CS1061: 'System.Web.Mvc.HtmlHelper' does not contain a definition for 'ValidationSummary' and no extension method 'ValidationSummary' accepting a first argument of type 'System.Web.Mvc.HtmlHelper' could be found (are you missing a using directive or an assembly reference?)
Source Error:
Line 49:
Line 50:
Line 51: Write(Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again."));
Line 52:
Line 53: WriteLiteral("\r\n");
Интересно, что ошибок времени компиляции нет. System.Web.WebPages, System.Web.Helpers и все необходимые DLL MVC 3 RC. Включая необходимый файл web.config. Как будто они недоступны, если просмотр пытается загрузить.
Фактический синтаксис бритвы, который, я считаю, является частью System.Web.WebPages? Где находится Html.ValidationSummary? System.Web.Mvc или System.Web.Helpers?
Ответы
Ответ 1
Я действительно обнаружил, что ASP.NET MVC 3 RC web.config отсутствовал в папке /Plugins. Это пустая папка, отличная от web.config, которая должна присутствовать для поставщика виртуального пути плагина. Это недостающее звено.
В основном происходит то, что у вас есть контроллер, который расширяет PluginController
. Этот контроллер изменяет путь к представлениям и добавляет "Plugin" и имя сборки (помните, что мы имеем дело со встроенными представлениями здесь). Таким образом, вы получаете что-то вроде
/Plugins/TestProject.dll/TestProject.Views.Account.LogOn.cshtml
Поставщик виртуального пути и коллективные классы затем позаботятся о поиске и возвращении этого представления из манифеста ресурса плагинов.
То, что у меня было в тупике, - это перерыв между Preview 1 и Beta, где они добавили _ViewStart.cshtml. Когда с плагином было запрошено представление, такое как Logon.cshtml, был сделан внутренний запрос с помощью фреймворка для файла _ViewStart, которого не было в этой сборке. Поскольку выполнение было уже в провайдере виртуального пути в тот момент, я не смог узнать, как вернуть _ViewStart.cshtml с веб-сайта. Поэтому вместо этого я добавил один к плагину.
Мне пришлось внести изменения как в PluginVirtualFile.cs, так и в PluginProvider.cs. Так что в конце концов все это работает.
Большое спасибо за вашу помощь, хотя @Eilon. Хотя он не пришел к ответу, он был очень признателен.
Ответ 2
Похоже, что ваш CSHTML файл скомпилирован так, как будто нет ключевого слова @model
и что он действительно думает, что вы хотите отобразить переменную с именем model
.
Если ваш файл CSHTML находится в папке Views
, которая содержит специальный файл web.config с параметрами Razor, специфичными для MVC, тогда он должен знать, что @model
- это ключевое слово, а не переменная, которая отображается. Проверьте файл ~/Views/web.config
и убедитесь, что он имеет раздел <system.razor.web>
и правильные настройки для хоста MVC Razor.
Ответ 3
У меня было это.. и это было , я не разворачивал свой web.config в маршруте или в папке "Представления".
(Я использовал Beyond Compare для развертывания, и у меня был отфильтрован файл web.config, поэтому он был пропущен)
Ответ 4
Пропустил это в моем случае:
Имел system.web.webPages.razon в configSections, но пропустил относительный раздел.
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>