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

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


person ryanzec    schedule 18.04.2011    source источник


Ответы (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();

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

person fretje    schedule 09.05.2011
comment
Спасибо за этот ответ, именно то, что я искал. Я все еще получаю сообщение об ошибке "View was not found". Он установлен как встроенный, но по-прежнему ничего. - person Pieter; 09.08.2011
comment
Мне пришлось добавить ссылку на пакет nuget на EmbeddedResourceVirtualPathProvider на моем веб-сайте, чтобы заставить это работать. - person Pieter; 04.10.2011
comment
Это похоже на то, что было у меня. Он отлично работает на моей машине разработчика, но на самом деле не выполняет поиск файлов представления записи после развертывания. Я зарегистрировал просмотры, которые он искал, и он полностью пропустил файлы .cshtml, хотя нашел для _layout и _viewstart. - person ; 15.12.2011

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

person Pieter    schedule 03.10.2011
comment
Просто ссылка? Что ты сделал, чтобы это зацепить? - person ; 15.12.2011
comment
В Visual Studio щелкните правой кнопкой мыши ссылки в обозревателе решений и выберите Добавить ссылку на пакет библиотеки. Выберите «Онлайн» во всплывающем окне и найдите EmbeddedResourceVirtualPathProvider, затем нажмите «Установить». Обратите внимание, что вам нужен VS2010, который был обновлен до Service Pack 1, чтобы установщик пакета Nuget стал его частью. - person Pieter; 16.12.2011

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

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

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

person DevMania    schedule 29.04.2011
comment
Я полагаю, что это зависит от порядка зарегистрированных механизмов просмотра, если встроенный механизм просмотра является первым, портативные представления области будут переопределять обычные представления в корневом проекте. В качестве примечания я скажу, что иногда вы можете получить небольшой прирост производительности, очистив все свои механизмы просмотра и убедившись, что вы зарегистрировали только те, которые используете в своем проекте. См. insightpassion.com/norbertraus/index.php/ 29.04.2011 / - person JohannesH; 28.09.2011