Внешняя область ASP.NET MVC 3 не компилируется во время выполнения (работает в Preview 1, но не RC) - PullRequest
13 голосов
/ 12 ноября 2010

Задача

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. Я нашел такой вопрос, когда кто-то из команды 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, который знает, как загружать встроенные ресурсы и удаляется 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 и все необходимые библиотеки MVC 3 RC присутствуют. Включая необходимые файлы web.config. Как будто они недоступны, когда представление пытается быть загруженным, однако.

Фактический синтаксис бритвы, на мой взгляд, является частью System.Web.WebPages? Где живет Html.ValidationSummary? System.Web.Mvc или System.Web.Helpers?

Ответы [ 4 ]

9 голосов
/ 12 ноября 2010

Я обнаружил, что в моей папке / Plugins отсутствует файл ASP.NET MVC 3 RC web.config. Это пустая папка, отличная от web.config, которая должна присутствовать для поставщика виртуального пути плагина. Это было недостающее звено.

В основном получается, что у вас есть контроллер, который расширяет PluginController. Этот контроллер изменяет путь к представлениям и добавляет «Плагин» и имя сборки (помните, что здесь мы имеем дело со встроенными представлениями). Таким образом, вы получите что-то вроде

/Plugins/TestProject.dll/TestProject.Views.Account.LogOn.cshtml

Поставщик виртуального пути и коллективные классы затем позаботятся о том, чтобы найти и вернуть это представление из манифеста ресурса плагинов.

Что меня действительно озадачило, так это серьезное изменение между Preview 1 и Beta, когда они добавили _ViewStart.cshtml. Когда представление, такое как Logon.cshtml, запрашивалось из плагина, внутренний каркас делал запрос для файла _ViewStart, который не существовал в этой сборке. Поскольку выполнение было уже в поставщике виртуального пути в тот момент, я не мог найти, чтобы возвратить _ViewStart.cshtml от веб-сайта. Поэтому вместо этого я добавил один к плагину.

Мне пришлось внести изменения как в PluginVirtualFile.cs, так и в PluginProvider.cs. В конце концов, все заработало.

Большое спасибо за вашу помощь, хотя @Eilon. Хотя он не пришел к ответу, он был высоко оценен.

7 голосов
/ 12 ноября 2010

Похоже, ваш CSHTML-файл компилируется, как будто нет ключевого слова @model, и что он действительно думает, что вы хотите отобразить переменную с именем model.

Если ваш CSHTML-файл находится в папке Views, которая содержит специальный файл web.config с настройками Razor для MVC, то он должен знать, что @model является ключевым словом, а не отображаемой переменной. Проверьте файл ~/Views/web.config и убедитесь, что в нем есть раздел <system.razor.web> и правильные настройки для хоста MVC Razor.

2 голосов
/ 06 ноября 2012

У меня было это .. и это было Я не развернул свой web.config ни в маршруте, ни в папке Views.

(я использовал Beyond Compare для развертывания и отфильтровал web.config, поэтому его пропустили)

0 голосов
/ 05 апреля 2015

В моем случае этого не хватало: имел 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...