ASP.NET MVC 3, простые представления и переносимые области

#asp.net-mvc-3 #razor #mvccontrib #portable-areas

#asp.net-mvc-3 #razor #mvccontrib #переносимые области

Вопрос:

Я пытаюсь использовать переносимые представления с ASP.NET MVC 3 и razor views, поскольку это кажется лучшим способом создания простой архитектуры подключаемых модулей. Итак, у меня настроена моя библиотека классов, и у меня есть представление, расположенное в / Views / Admin / Index.cshtml, и оно установлено как встроенный ресурс. Затем я включаю этот проект в качестве зависимости для основного проекта веб-приложения. Когда я пытаюсь получить доступ к контроллеру администратора, действие Index, я получаю сообщение о том, что не удается найти этот файл view (значит, контроллер включен должным образом). Я предполагаю, что он пытается заглянуть в основной проект веб-приложения, а не в двоичный файл переносимых областей. Есть ли способ заставить razor views работать с переносимыми областями?

Ответ №1:

Я некоторое время боролся с этой конкретной проблемой, но, думаю, наконец-то разобрался.

Структура папок и то, как пространства имен вызываются внутри вашего проекта, очень важны для правильной работы!

Здесь у меня есть рабочий пример переносимой области со встроенными razor views:

https://github.com/fretje/MembershipStarterKit

Взгляните на структуру проекта.

Имя области — UserAdministration , и в корневом каталоге проекта есть UserAdministrationRegistration класс, который находится в UserAdministration пространстве имен. Затем есть Controllers , Models и Views папка (как в обычном проекте MVC), а под Views папкой снова есть UserAdministration папка, которая содержит представления для области.

Также есть кое-что еще, что очень важно для работы встроенных представлений: вы должны зарегистрировать новый механизм просмотра в Application_Start методе вашего global.asax.cs файла, вы это сделали?

 PortableAreaRegistration.RegisterEmbeddedViewEngine();
  

И… В вашем классе регистрации убедитесь, что вы переопределили RegisterArea метод, который принимает 2 параметра ( AreaRegistrationContext context и IApplicationBus bus ), и вызываете в нем базовую реализацию:

 public override void RegisterArea(AreaRegistrationContext context, 
    IApplicationBus bus)
{
    base.RegisterArea(context, bus); // <== very important!

    context.MapRoute(
        "UserAdministration", 
        AreaName   "/{controller}/{action}/{id}",
        new { controller = "UserAdministration", action = "Index", 
              id = UrlParameter.Optional }
    );
}
  

Если вы не вызываете базовую реализацию, вы должны, по крайней мере, добавить

 RegisterAreaEmbeddedResources();
  

Чтобы убедиться, что ваши встроенные представления и ресурсы зарегистрированы.

Комментарии:

1. Спасибо за этот ответ, именно то, что я искал. Я все еще получаю сообщение об ошибке view не найден. Он установлен как встроенный, но по-прежнему ничего.

2. Мне пришлось добавить ссылку на пакет nuget для EmbeddedResourceVirtualPathProvider на моем веб-сайте, чтобы заставить это работать.

3. Это выглядит идентично тому, что у меня было. Это отлично работает на моем компьютере разработчика, но на самом деле не просматривает файлы представления записи после развертывания. Я зарегистрировал просмотры, которые он искал, и он полностью пропустил файлы .cshtml, хотя он нашел файлы для _layout и _viewstart .

Ответ №2:

Я добился этого, следуя инструкциям в ответе Фретье, а затем также добавил ссылку на пакет nuget для EmbeddedResourceVirtualPathProvider на вашем веб-сайте.

Комментарии:

1. Просто ссылка? Что вы сделали, чтобы подключить это?

2. В Visual Studio щелкните правой кнопкой мыши на ссылках в обозревателе решений и выберите «Добавить ссылку на пакет библиотеки». Выберите «онлайн» во всплывающем окне и найдите «EmbeddedResourceVirtualPathProvider», затем нажмите установить. Обратите внимание, что вам нужен VS2010, который был обновлен до пакета обновления 1 для установщика пакета Nuget, чтобы быть его частью.

Ответ №3:

Вы убедились, что пометили свое представление как встроенный ресурс в переносимой области?

Также я обнаружил, что приятной особенностью переносимых областей является то, что вы можете переопределять встроенные представления, поэтому, если вы разместите представление в своем хост-приложении с тем же именем и местоположением, что и встроенное, с другой логикой кода, оно будет иметь приоритет над встроенным. Приятно!!!

Надеюсь, это поможет

Комментарии:

1. Я полагаю, это зависит от порядка зарегистрированных движков просмотра, если встроенный движок просмотра является первым, представления переносимой области переопределят обычные представления в корневом проекте. В качестве дополнительного замечания я скажу, что иногда вы можете получить небольшой прирост производительности, очистив все свои механизмы просмотра и убедившись, что вы зарегистрировали только те, которые используете в своем проекте. Смотрите insightpassion.com/norbertraus/index.php/2011/04/29 /…