asp.net-mvc – 如何在我的区域内进行FindPartialView搜索?

所以我在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路径中存储了我正在寻找的部分内容.

点赞