如何通过控制器返回另一个控制器的部分视图?

我在Views\ABC文件夹中有一个XXX.cshtml文件。 它的控制者是ABC

我也有一个在我的DEF控制器的操作方法返回一个部分Partialview("XXX" , xyzmodel)

我收到“查看未find”错误。

如何从其他控制器调用该视图

通常,视图属于支持其数据要求的特定匹配控制器 ,或者如果在控制器(因此是名称)之间Views/Shared ,视图就属于Views/Shared文件夹。

“答案”(但不build议 – 见下文):

可以通过指定完整path(包括扩展名) 引用其他控制器的视图/部分视图,如下所示:

 return PartialView("~/views/ABC/XXX.cshtml", zyxmodel); 

或一个相对path(没有扩展名),基于@Max Toro的回答

 return PartialView("../ABC/XXX", zyxmodel); 

但这不是一个好主意

*注意:这是唯一可用的两种语法 。 不ABC\\XXXABC/XXX或任何其他变化,因为这些都是相对path,并没有find一个匹配。

更好的select:

您可以在您的视图中使用Html.Renderpartial ,但它也需要扩展名:

 Html.RenderPartial("~/Views/ControllerName/ViewName.cshtml", modeldata); 

内联Razor语法使用@Html.Partial

 @Html.Partial("~/Views/ControllerName/ViewName.cshtml", modeldata) 

你可以使用没有扩展名的../controller/view语法(再次归功于@Max Toro):

 @Html.Partial("../ControllerName/ViewName", modeldata) 

注意:显然RenderPartial比Partial稍快,但这并不重要。

如果您想实际调用其他控制器,请使用:

 @Html.Action("action", "controller", parameters) 

推荐解决scheme:@ Html.Action

我个人的偏好是使用@Html.Action因为它允许每个控制器pipe理自己的视图,而不是交叉引用来自其他控制器的视图(这导致了一个大的意大利面条一样的混乱)。

你通常只传递所需的键值(如任何其他视图),例如对于你的例子:

 @Html.Action("XXX", "ABC", new {id = model.xyzId }) 

这将执行ABC.XXX操作并就地显示结果。 这允许视图和控制器保持独立自足(即可重用)。

2014年9月更新:

我刚刚遇到了无法使用@ Html.Action的情况,但需要根据actioncontroller名称创build视图path。 为此,我将这个简单的View扩展方法添加到UrlHelper所以你可以说返回PartialView(Url.View("actionName", "controllerName"), modelData)

 public static class UrlHelperExtension { /// <summary> /// Return a view path based on an action name and controller name /// </summary> /// <param name="url">Context for extension method</param> /// <param name="action">Action name</param> /// <param name="controller">Controller name</param> /// <returns>A string in the form "~/views/{controller}/{action}.cshtml</returns> public static string View(this UrlHelper url, string action, string controller) { return string.Format("~/Views/{1}/{0}.cshtml", action, controller); } } 

该控件按以下顺序search视图:

  • 首先在共享文件夹中
  • 然后在匹配当前控制器的文件夹(在你的情况下,它是视图/ DEF)

由于在这些位置中没有xxx.cshtml ,因此会返回“未find视图”错误。

解决scheme:您可以使用视图的完整path:

喜欢

  PartialView("~/views/ABC/XXX.cshtml", zyxmodel); 

只要你可以使用:

 PartialView("../ABC/XXX")