#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:
Взгляните на структуру проекта.
Имя области — 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 /…