4

所以我注册了所有区域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"
4

1 回答 1

2

我遇到了完全相同的问题,我使用了一个中央 Ajax 控制器,在其中我从不同的文件夹/位置返回不同的局部视图。

您将要做的是创建一个新的ViewEngine派生自 a RazorViewEngine(我假设您使用 Razor)并在构造函数中显式包含新位置以搜索部分。

或者,您可以覆盖该FindPartialView方法。默认情况下Shared,当前控制器上下文中的文件夹和文件夹用于搜索。

这是一个示例,它向您展示如何覆盖自定义RazorViewEngine.

更新

您应该在 PartialViewLocationFormats 数组中包含部分的路径,如下所示:

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路径中。

于 2013-03-16T17:31:57.533 回答