ASP.NET MVC 3, Razor Views и переносимые области

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

3 ответа

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам