ASP.NET MVC 3, Razor Views и переносимые области - PullRequest
16 голосов
/ 18 апреля 2011

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

Ответы [ 3 ]

12 голосов
/ 09 мая 2011

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

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

У меня есть рабочий пример 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();

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

1 голос
/ 04 октября 2011

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

0 голосов
/ 30 апреля 2011

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

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

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

...