我正在开发一个可插入的ASP.NET MVC Web应用程序,它可以在Areas目录中发现并注册运行区域。
我的问题是视图引擎找不到该区域的任何视图。
我有一个位于
的局部视图〜/地区/目录/查看/共享/ _SearchBarPartial.cshtml
我使用以下方式设置区域:
htmlHelper.ViewContext.RouteData.DataTokens["area"] = "Catalog";
但执行时
Html.Partial("_SearchBarPartial")
我收到以下错误:
未找到部分视图“_SearchBarPartial”或视图引擎不支持搜索的位置。以下地点是 搜寻:
〜/地区/目录/查看/主页/ _SearchBarPartial.aspx 〜/地区/目录/浏览/首页/ _SearchBarPartial.ascx 〜/地区/目录/查看/共享/ _SearchBarPartial.aspx 〜/地区/目录/查看/共享/ _SearchBarPartial.ascx 〜/浏览/首页/ _SearchBarPartial.aspx 〜/浏览/首页/ _SearchBarPartial.ascx 〜/查看/共享/ _SearchBarPartial.aspx 〜/查看/共享/ _SearchBarPartial.ascx 〜/地区/目录/浏览/首页/ _SearchBarPartial.cshtml 〜/地区/目录/浏览/首页/ _SearchBarPartial.vbhtml 〜/地区/目录/查看/共享/ _SearchBarPartial.cshtml 〜/地区/目录/查看/共享/ _SearchBarPartial.vbhtml 〜/浏览/首页/ _SearchBarPartial.cshtml 〜/浏览/首页/ _SearchBarPartial.vbhtml 〜/查看/共享/ _SearchBarPartial.cshtml 〜/查看/共享/ _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();
// ...
}
}
答案 0 :(得分:1)
您可以在Global.asax.cs中添加自定义RazorViewEngine。例如:
RazorViewEngine objRazorViewEngine = new RazorViewEngine();
objRazorViewEngine.PartialViewLocationFormats = new string[]
{
"~/Areas/Catalog/Views/Shared/{0}.cshtml"
};
ViewEngines.Engines.Add(objRazorViewEngine);