所以我在Global.asax
注册所有区域:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
//...
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
但在我的/Areas/Log/Controllers
中,当我尝试找到PartialView
:
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, "_LogInfo");
失败,viewResult.SearchedLocations
是:
"~/Views/Log/_LogInfo.aspx"
"~/Views/Log/_LogInfo.ascx"
"~/Views/Shared/_LogInfo.aspx"
"~/Views/Shared/_LogInfo.ascx"
"~/Views/Log/_LogInfo.cshtml"
"~/Views/Log/_LogInfo.vbhtml"
"~/Views/Shared/_LogInfo.cshtml"
"~/Views/Shared/_LogInfo.vbhtml"
因此viewResult.View
是null
。
如何在我的区域进行FindPartialView
搜索?
更新:
这是我在Global.asax
注册的自定义视图引擎:
public class MyCustomViewEngine : RazorViewEngine
{
public MyCustomViewEngine() : base()
{
AreaPartialViewLocationFormats = new[]
{
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.cshtml"
};
PartialViewLocationFormats = new[]
{
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml"
};
// and the others...
}
}
但FindPartialView
不使用AreaPArtialViewLocationFormats
:
"~/Views/Log/_LogInfo.cshtml"
"~/Views/Shared/_LogInfo.cshtml"
答案 0 :(得分:2)
我有完全相同的问题,我有一个我使用的中央Ajax控制器,在其中我从不同的文件夹/位置返回不同的部分视图。
您要做的是创建一个新的ViewEngine
派生自RazorViewEngine
(我假设您正在使用Razor)并明确在构造函数中包含新位置以搜索部分内容英寸
或者,您可以覆盖FindPartialView
方法。默认情况下,Shared
文件夹和当前控制器上下文中的文件夹用于搜索。
以下是example,其中介绍了如何覆盖自定义RazorViewEngine
中的特定属性。
<强>更新强>
您应该在PartialViewLocationFormats数组中包含partial的路径,如下所示:
public class MyViewEngine : RazorViewEngine
{
public MyViewEngine() : base()
{
PartialViewLocationFormats = new string[]
{
"~/Area/{0}.cshtml"
// .. Other areas ..
};
}
}
同样,如果要在Area
文件夹中的Controller中找到部分内容,则必须将标准局部视图位置添加到AreaPartialViewLocationFormats
数组中。我测试了这个,它对我有用。
请记住将新的RazorViewEngine
添加到Global.asax.cs
,例如:
protected void Application_Start()
{
// .. Other initialization ..
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new MyViewEngine());
}
以下是如何在名为“Home”的示例性控制器中使用它:
// File resides within '/Controllers/Home'
public ActionResult Index()
{
var pt = ViewEngines.Engines.FindPartialView(ControllerContext, "Partial1");
return View(pt);
}
我已经在/Area/Partial1.cshtml
路径中存储了我正在寻找的部分内容。