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