如何在我的区域内进行FindPartialView搜索?

时间:2013-03-16 17:25:35

标签: asp.net-mvc

所以我在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.Viewnull

如何在我的区域进行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"

1 个答案:

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