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

Опитвам се да използвам преносими изгледи с ASP.NET MVC 3 и изгледи с бръснач, тъй като това изглежда като най-добрият начин за създаване на лесна архитектура на добавки. Така че имам настройка на моята библиотека от класове и имам моя изглед, намиращ се в /Views/Admin/Index.cshtml и той е зададен като вграден ресурс. След това включвам този проект като зависимост за основния проект за уеб приложение. Когато се опитам да осъществя достъп до администраторския контролер, действието за индексиране, получавам съобщение, че не мога да намеря този файл за изглед (така че контролерът е правилно включен). Предполагам, че се опитва да търси в основния проект за уеб приложение, а не в двоичния файл на преносимите области. Има ли начин да накарате изгледите да работят с преносими области?


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


Отговори (3)


От известно време се боря с този конкретен проблем, но мисля, че най-накрая го разбрах.

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

Тук имам работещ пример за преносима зона с вградени изгледи с бръснач:

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

Ако не извикате базовата реализация, трябва поне да добавите a

RegisterAreaEmbeddedResources();

За да сте сигурни, че вашите вградени изгледи и ресурси са регистрирани.

person fretje    schedule 09.05.2011
comment
Благодаря за този отговор, точно това, което търсих. Все още получавам грешката, че изгледът не е намерен. Настроен е като вграден, но все още нищо. - 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 щракнете с десния бутон върху препратките в Solution Explorer и изберете Добавяне на препратка към пакет от библиотека. Изберете онлайн в изскачащия прозорец и потърсете EmbeddedResourceVirtualPathProvider, след което щракнете върху инсталиране. Имайте предвид, че имате нужда от VS2010, който е актуализиран до Service Pack 1 за инсталатора на пакет Nuget, за да бъде част от него. - person Pieter; 16.12.2011

Уверихте ли се, че сте маркирали своя изглед като вграден ресурс във вашата преносима област?

Също така открих, че добрата характеристика на преносимите области е, че можете да замените вградените изгледи, така че ако поставите изглед във вашето хост приложение със същото име и местоположение на вграденото с различна логика на кода, то ще има приоритет пред вграденото. Хубаво !!!

Надявам се това да помогне

person DevMania    schedule 29.04.2011
comment
Предполагам, че това зависи от реда на регистрираните машини за изгледи, ако вградената машина за изглед е първа, изгледите на преносима област ще заменят обикновените изгледи в основния проект. Като странична бележка ще кажа, че понякога можете да получите малко увеличение на производителността, като изчистите всичките си машини за изгледи и се уверите, че сте регистрирали само тези, които използвате във вашия проект. Вижте insightpassion.com/norbertraus/index.php/ 2011/04/29/ - person JohannesH; 28.09.2011