ASP.NET MVC 3, Razor Views и Portable Areas

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

Ответы

Ответ 1

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

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

У меня есть рабочий пример портативной области со встроенными представлениями бритвы здесь:

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();

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

Ответ 2

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

Ответ 3

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

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

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