如何通过控制器返回另一个控制器的部分视图?
我在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\\XXX
或ABC/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的情况,但需要根据action
和controller
名称创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")