Razor View для сменной области не найден
Я работаю над подключаемым веб-приложением ASP.NET MVC, которое обнаруживает и регистрирует области во время выполнения из каталога Areas.
Моя проблема в том, что механизм просмотра не находит никаких представлений из этой области.
У меня есть один частичный вид, расположенный на
~ / Области / Каталог / Просмотров / Shared / _SearchBarPartial.cshtml
Я установил область, используя:
htmlHelper.ViewContext.RouteData.DataTokens["area"] = "Catalog";
Но при выполнении
Html.Partial("_SearchBarPartial")
Я получаю следующую ошибку:
Частичное представление '_SearchBarPartial' не найдено, или никакой движок представления не поддерживает искомые местоположения. Были найдены следующие места:
~ / Области / Каталог / Представления / Главная /_SearchBarPartial.aspx ~/ Области / Каталог / Представления / Главная /_SearchBarPartial.ascx ~/ Области / Каталог / Представления / Общий /_SearchBarPartial.aspx ~/ Области / Каталог / Представления / Общий /_SearchBarPartial.ascx ~/ Просмотров /Home/_SearchBarPartial.aspx ~/ Просмотров /Home/_SearchBarPartial.ascx ~/Views/Shared/_SearchBarPartial.aspx ~/Views/Shared/_SearchBarPartial.ascx ~/ Области / Каталог /Views/Home/_SarchBar. cshtml ~ / Области / Каталог / Представления /Home/_SearchBarPartial.vbhtml ~/ Области / Каталог / Представления / Shared / _SearchBarPartial.cshtml ~ / Области / Каталог / Представления /Shared/_SearchBarPartial.vbhtml ~/Views/Home/_SearchBarPar /Views/Home/_SearchBarPartial.vbhtml ~/Views/Shared/_SearchBarPartial.cshtml ~/Views/Shared/_SearchBarPartial.vbhtml
Моя структура папок:
bin/
Areas/
Catalog/
bin/
CatalogArea.dll
Content/
Scripts/
Views/
Shared/
_SearchBarPartial.cshtml
CatalogArea.cs
Content/
Scrips/
Views/
Global.asax
Для регистрации областей я использую следующий код, выполняемый перед запуском приложения:
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(Bootstrapper), "LoadAreas")]
public class Bootstrapper
{
public static string ModuleDirectory
{
get { return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Areas"); }
}
public static void LoadAreas()
{
var assemblyFiles = Directory.GetFiles(ModuleDirectory, "*.dll", SearchOption.AllDirectories);
assemblyFiles.ForEach(af =>
{
var assembly = Assembly.LoadFile(af);
if(assembly.GetTypes().Any(t => IsArea(t))
{
BuildManager.AddReferencedAssembly(assembly);
}
});
}
private static bool IsArea(Type t)
{
return typeof (AreaRegistration).IsAssignableFrom(t) && !t.IsAbstract;
}
}
Global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
// ...
}
}
1 ответ
Вы можете добавить свой собственный RazorViewEngine в Global.asax.cs. Пример:
RazorViewEngine objRazorViewEngine = new RazorViewEngine();
objRazorViewEngine.PartialViewLocationFormats = new string[]
{
"~/Areas/Catalog/Views/Shared/{0}.cshtml"
};
ViewEngines.Engines.Add(objRazorViewEngine);