所以我在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"
最佳答案 我有完全相同的问题,我有一个我使用的中央Ajax控制器,在其中我从不同的文件夹/位置返回不同的部分视图.
您将要做的是创建一个源自RazorViewEngine的新ViewEngine(我假设您使用Razor)并在构造函数中明确包含新位置以搜索其中的部分.
或者,您可以覆盖FindPartialView方法.默认情况下,共享文件夹和当前控制器上下文中的文件夹用于搜索.
这是一个example,它向您展示如何覆盖自定义RazorViewEngine中的特定属性.
更新
您应该在PartialViewLocationFormats数组中包含partial的路径,如下所示:
public class MyViewEngine : RazorViewEngine
{
public MyViewEngine() : base()
{
PartialViewLocationFormats = new string[]
{
"~/Area/{0}.cshtml"
// .. Other areas ..
};
}
}
同样,如果要在Area文件夹中的Controller中找到partial,则必须将标准局部视图位置添加到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路径中存储了我正在寻找的部分内容.