使用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
答案 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";
}
}