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