我在Views\ABC
文件夹中有一个XXX.cshtml
文件,其控制器是ABC
我还在我的DEF
控制器中有一个操作方法,返回一个Partialview("XXX" , xyzmodel)
我收到一个"视图未找到"的错误提示。
如何从其他控制器调用该视图?
我在Views\ABC
文件夹中有一个XXX.cshtml
文件,其控制器是ABC
我还在我的DEF
控制器中有一个操作方法,返回一个Partialview("XXX" , xyzmodel)
我收到一个"视图未找到"的错误提示。
如何从其他控制器调用该视图?
通常视图属于特定的匹配控制器,支持其数据需求,或者如果在控制器之间共享(因此得名),则视图属于Views/Shared
文件夹。
您可以通过指定完整路径(包括扩展名)从另一个控制器引用视图/部分视图,例如:
return PartialView("~/views/ABC/XXX.cshtml", zyxmodel);
或相对路径(没有扩展名),基于@Max Toro
的答案
return PartialView("../ABC/XXX", zyxmodel);
但这并不是一个好主意
*注意:这是仅有的两个有效语法,不要使用ABC\\XXX
或ABC/XXX
或任何其他变化,因为它们都是相对路径,并且无法找到匹配项。
您可以在视图中使用Html.Renderpartial
,但也需要扩展名:
Html.RenderPartial("~/Views/ControllerName/ViewName.cshtml", modeldata);
使用@Html.Partial
实现内联Razor语法:
@Html.Partial("~/Views/ControllerName/ViewName.cshtml", modeldata)
你可以使用没有扩展名的 ../controller/view
语法(再次感谢 @Max Toro):@Html.Partial("../ControllerName/ViewName", modeldata)
注意:显然RenderPartial
比Partial略快,但这并不重要。
如果你想实际调用另一个控制器,请使用:
@Html.Action("action", "controller", parameters)
我个人倾向于使用@Html.Action
,因为它允许每个控制器管理自己的视图,而不是从其他控制器交叉引用视图(这会导致大量像意大利面条一样混乱的代码)。
您通常只需传递所需的关键值(就像任何其他视图一样),例如对于您的示例:
@Html.Action("XXX", "ABC", new {id = model.xyzId })
这将执行ABC.XXX
操作并在原地呈现结果。这使得视图和控制器保持分开自包含(即可重用)。
我遇到了一种情况,无法使用@Html.Action,但需要根据action
和controller
名称创建视图路径。 为此,我向UrlHelper
添加了这个简单的View
扩展方法,因此您可以说return 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);
}
}
控件按以下顺序搜索视图:
由于这些位置中都没有 xxx.cshtml
,因此控件返回“未找到视图”错误。
解决方案:您可以使用视图的完整路径:
例如
PartialView("~/views/ABC/XXX.cshtml", zyxmodel);
您可以简单地使用以下方法:
PartialView("../ABC/XXX")