ASP.NET MVC 3, Razor Views и переносимые области
Я пытаюсь использовать переносимые виды с ASP.NET MVC 3 и бритвенными видами, так как это кажется лучшим способом создания простой архитектуры подключаемых модулей. Итак, у меня есть настройка библиотеки классов, и мое представление находится в /Views/Admin/Index.cshtml, и оно установлено как встроенный ресурс. Затем я включаю этот проект в качестве зависимости для основного проекта веб-приложения. Когда я пытаюсь получить доступ к контроллеру администратора, при выполнении действия "Индекс" появляется сообщение о том, что не удается найти этот файл представления (поэтому контроллер правильно включен). Я предполагаю, что он пытается заглянуть в основной проект веб-приложения, а не в двоичные области переносимых областей. Есть ли способ заставить бритвенные виды работать с переносными участками?
3 ответа
Я боролся по этому конкретному вопросу некоторое время, но, думаю, наконец-то понял.
Структура папок и то, как пространства имен вызываются внутри вашего проекта, очень важны для правильной работы!
У меня есть рабочий пример Portable Area со встроенными видами бритвы здесь:
Посмотрите на структуру проекта.
Название области 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();
Чтобы убедиться, что ваши встроенные представления и ресурсы зарегистрированы.
Я получил эту работу, следуя инструкциям в ответе Фретье, а затем также добавил ссылку на пакет nuget на EmbeddedResourceVirtualPathProvider на своем веб-сайте.
Вы удостоверились, что пометили свой вид как встроенный ресурс в переносимой области?
Также я обнаружил, что приятной особенностью переносимых областей является то, что вы можете переопределить встроенные представления, поэтому, если вы разместите представление в своем хост-приложении с тем же именем и расположением встроенного приложения с другой кодовой логикой, оно будет иметь приоритет над встроенным видом Nice.!!!
Надеюсь это поможет