Опитвам се да използвам преносими изгледи с ASP.NET MVC 3 и изгледи с бръснач, тъй като това изглежда като най-добрият начин за създаване на лесна архитектура на добавки. Така че имам настройка на моята библиотека от класове и имам моя изглед, намиращ се в /Views/Admin/Index.cshtml и той е зададен като вграден ресурс. След това включвам този проект като зависимост за основния проект за уеб приложение. Когато се опитам да осъществя достъп до администраторския контролер, действието за индексиране, получавам съобщение, че не мога да намеря този файл за изглед (така че контролерът е правилно включен). Предполагам, че се опитва да търси в основния проект за уеб приложение, а не в двоичния файл на преносимите области. Има ли начин да накарате изгледите да работят с преносими области?
ASP.NET MVC 3, изгледи Razor и преносими области
Отговори (3)
От известно време се боря с този конкретен проблем, но мисля, че най-накрая го разбрах.
Структурата на папките и как се извикват пространствата от имена във вашия проект е много важно, за да работи правилно!
Тук имам работещ пример за преносима зона с вградени изгледи с бръснач:
Разгледайте структурата на проекта.
Името на областта е 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();
За да сте сигурни, че вашите вградени изгледи и ресурси са регистрирани.
Постигнах това да работи, като следвах инструкциите в отговора на Fretje и след това добавих препратка към пакет nuget към EmbeddedResourceVirtualPathProvider във вашия уебсайт.
Уверихте ли се, че сте маркирали своя изглед като вграден ресурс във вашата преносима област?
Също така открих, че добрата характеристика на преносимите области е, че можете да замените вградените изгледи, така че ако поставите изглед във вашето хост приложение със същото име и местоположение на вграденото с различна логика на кода, то ще има приоритет пред вграденото. Хубаво !!!
Надявам се това да помогне