【问题标题】:cannot render asp.net mvc partial view无法呈现 asp.net mvc 部分视图
【发布时间】:2014-06-05 13:08:14
【问题描述】:

使用 ajax 我在 asp.net mvc 控制器操作上收到某些字符串。基于该字符串值,我想呈现部分视图。

public ActionResult GetTabData(string activeTab)
        {
            string viewName = String.Empty;
            switch (activeTab)
            {
                case "all":
                    viewName = "_AllPartial";
                    break;
                case "one":
                    viewName = "_OnePartial";
                    break;
                case "two":
                    viewName = "_TwoPartial";
                default:
                    viewName = "_AllPartial";      
                    break;                    
            }               
            return PartialView("/Home/"+viewName);   
        }

所有部分视图都存储在 Views/Home 目录中,但我经常收到无法找到部分视图的错误

The partial view '/Home/_AllPartial' was not found or no view engine supports the searched locations. The following locations were searched:
/Home/_AllPartial

【问题讨论】:

  • 也许以波浪号开头:“~/Home/”?
  • 您需要一个自定义的 ViewEngine 来执行此操作,请参阅下面的答案。

标签: c# .net asp.net-mvc


【解决方案1】:

这是正常的,因为“Home”目录不是应该存储部分视图的位置。

部分视图应存储在您的 /Shared 文件夹中以使其正常工作,但是,如果您希望项目中有一些组织,您可以随时编写自己的自定义 ViewEngine。

这是一个示例:

public class ExtendedRazorViewEngine : RazorViewEngine
{
    #region Methods

    public void AddViewLocationFormat(string paths)
    {
        var existingPaths = new List<string>(ViewLocationFormats) {paths};

        ViewLocationFormats = existingPaths.ToArray();
    }

    public void AddPartialViewLocationFormat(string paths)
    {
        var existingPaths = new List<string>(PartialViewLocationFormats) {paths};

        PartialViewLocationFormats = existingPaths.ToArray();
    }

    #endregion
}

所以,现在在您的 Global.asax 中,您需要注册这个视图引擎。

 var engine = new ExtendedRazorViewEngine();
 engine.AddPartialViewLocationFormat("~/Views/Grids/{0}.cshtml");
 engine.AddPartialViewLocationFormat("~/Views/Modals/{0}.cshtml");
 ViewEngines.Engines.Add(engine);

在上面的示例中,您会看到我创建了一个新引擎,并为我的视图指定了 2 个位置。

这在我的实现中有效,所以试一试。

【讨论】:

    【解决方案2】:

    这不行吗?

    public ActionResult GetTabData(string activeTab)
        {
            string viewName = String.Empty;
            switch (activeTab)
            {
                case "all":
                    viewName = "_AllPartial";
                    break;
                case "one":
                    viewName = "_OnePartial";
                    break;
                case "two":
                    viewName = "_TwoPartial";
                default:
                    viewName = "_AllPartial";      
                    break;                    
            }               
            return PartialView(string.concat("~/Views/Home/", viewName, ".cshtml");   
        }
    

    【讨论】:

    • 当我们使用'~Views/Home/Index.cshtml"之类的路径指定视图名称时,我们还需要包含文件扩展名
    【解决方案3】:

    在指定目录时,我们还需要指定视图文件扩展名(.cshtml/.aspx)。

    public ActionResult GetTabData(string activeTab)
        {
            string viewName = String.Empty;
            switch (activeTab)
            {
                case "all":
                    viewName = "_AllPartial";
                    break;
                case "one":
                    viewName = "_OnePartial";
                    break;
                case "two":
                    viewName = "_TwoPartial";
                default:
                    viewName = "_AllPartial";      
                    break;                    
            }               
            return PartialView("~/Views/Home/"+viewName+".cshtml");   
        }
    

    【讨论】:

      【解决方案4】:

      将视图放在与控制器名称相同的视图文件夹或共享文件夹中,然后发送部分视图,先不要“/Home”。它将自动解析视图的完整路径。

      另外,局部视图应该在父视图中呈现。你为什么要自己退货?只需使用标准视图,摆脱布局,只需根据需要设置不同的布局即可:

      @{
          if (ViewBag.Modal != null && ViewBag.Modal) 
          { 
              Layout = "~/Views/Shared/_LayoutModal.cshtml";
          }
          else 
          { 
              Layout = "~/Views/Shared/_Layout.cshtml"; 
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-17
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 2012-04-13
        相关资源
        最近更新 更多