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


78

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

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

我收到“找不到视图”错误。

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

Answers:


156

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

“答案”(但不建议-见下文):

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

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

或相对路径(无扩展名),具体取决于答案 @Max Toro

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

但无论如何这都不是一个好主意

*注意:这是仅有的两种语法。不是ABC\\XXXABC/XXX其他任何变体,因为它们都是相对路径且找不到匹配项。

更好的选择:

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

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

使用@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)

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

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

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

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

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

2014年9月更新:

我刚刚遇到无法使用@ Html.Action,但需要基于actioncontroller名称创建视图路径的情况。为此,我添加了此简单的View扩展方法,UrlHelper以便您可以说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);
    }
}

3
@ Html.Action是必去之路
Arman

您推荐的方法将使我从视图中调用服务以检索部分需求的模型。我无法避免的。
Raimonds

11

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

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

由于您不在xxx.cshtml这些位置,它会返回“找不到视图”错误。

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

喜欢

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

@TrueBlueAussie感谢您的纠正。你解释得很好。它不仅仅与"best answer tick' and up-votes分享有关。.谢谢您的观点。:)
Arun Chandran C

确实。这就是为什么我还要编辑您的条目以进行改进。
Gone Coding

6

只需您可以使用:

PartialView("../ABC/XXX")

最初,我对此语法表示怀疑,但是它可以正常工作,包括从默认控制器操作中获取。您有参考资料吗?
Gone Coding
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.