无法渲染asp.net mvc局部视图

时间:2014-06-05 13:08:15

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

使用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

4 个答案:

答案 0 :(得分:2)

这是正常的,因为" 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个位置。

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

答案 1 :(得分: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");   
    }

答案 2 :(得分:1)

我们还需要在指定目录时指定视图文件扩展名(.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");   
    }

答案 3 :(得分:1)

将视图放在与控制器名称或共享文件夹相同的视图文件夹中,并发送部分视图,no&#34; / Home&#34;第一。它将自动解析视图的完整路径。

此外,partials意味着在父视图中呈现。你为什么试图把它归还给它?只需使用标准视图,并摆脱布局,只需根据您的需要设置不同的布局:

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