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

Vin*_*tel 72 c# asp.net-mvc

XXX.cshtmlViews\ABC文件夹中有一个文件.它的控制器是ABC

我的DEF控制器中还有一个返回a 的动作方法Partialview("XXX" , xyzmodel)

我收到"未找到视图"错误.

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

Gon*_*ing 147

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

"答案"(但不推荐 - 见下文):

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

return PartialView("~/views/ABC/XXX.cshtml", zyxmodel);
Run Code Online (Sandbox Code Playgroud)

或者相对路径(没有扩展名),基于答案 @Max Toro

return PartialView("../ABC/XXX", zyxmodel);
Run Code Online (Sandbox Code Playgroud)

但这不是一个好的想法

*注意:这是唯一有效的两种语法.不是ABC\\XXX或者ABC/XXX任何其他变体,因为它们都是相对路径并且没有找到匹配.

更好的选择:

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

Html.RenderPartial("~/Views/ControllerName/ViewName.cshtml", modeldata);
Run Code Online (Sandbox Code Playgroud)

使用@Html.Partial内联剃刀语法:

@Html.Partial("~/Views/ControllerName/ViewName.cshtml", modeldata)
Run Code Online (Sandbox Code Playgroud)

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

@Html.Partial("../ControllerName/ViewName", modeldata)
Run Code Online (Sandbox Code Playgroud)

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

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

@Html.Action("action", "controller", parameters)
Run Code Online (Sandbox Code Playgroud)

推荐的解决方案:@ Html.Action

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

您通常只传递所需的键值(与任何其他视图一样),例如:

@Html.Action("XXX", "ABC", new {id = model.xyzId })
Run Code Online (Sandbox Code Playgroud)

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

2014年9月更新:

我刚刚遇到无法使用@ Html.Action但需要根据a actioncontroller名称创建视图路径的情况.为此,我添加了这个简单的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @ Html.Action是要走的路 (3认同)

Aru*_*n C 11

控件按以下顺序搜索视图:

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

正如您xxx.cshtml在这些位置没有的那样,它会返回"未找到视图"错误.

解决方案:您可以使用视图的完整路径:

喜欢

 PartialView("~/views/ABC/XXX.cshtml", zyxmodel);
Run Code Online (Sandbox Code Playgroud)


Max*_*oro 6

你可以使用:

PartialView("../ABC/XXX")
Run Code Online (Sandbox Code Playgroud)