从另一个控制器(位于另一个文件夹中)渲染部分视图。

26

我有两个需要表示的数据库实体,我需要将它们输出在同一页上。

我的情况类似于这样:

视图 定义 视图A 视图B 测试 视图C

我希望ViewC显示ViewA,而ViewA又显示ViewB。

现在我正在使用类似于以下的代码:

// View C
<!-- bla -->
<% Html.RenderPartial(Url.Content("../Definition/DefinitionDetails"), i); %>


// View A
<!-- bla -->
<% Html.RenderPartial(Url.Content("../Definition/DefinitionEditActions")); %>

有没有更好的方法来做到这一点?我发现使用相对路径链接可能会出问题。有什么建议吗?

我有没有办法像这样做...

Html.RenderPartial("Definition","DefinitionDetails",i); ?

谢谢帮助。

4个回答

48

这对我有效!

@Html.Partial("~/Views/NewsFeeds/NewsFeedPartial.cshtml")

1
为什么当它在其他控制器文件夹中时,需要放置 *.cshtml ? - angel

35

您可以使用完整路径引用视图,例如:

Html.RenderPartial("~/Views/Definition/DefinitionDetails")

更好的方法是使用T4MVC库,它可以完成上述操作并使其(准)强类型化。您可以从任何控制器或视图引用任何视图。使用方法如下:

Html.RenderPartial(MVC.Definition.Views.DefinitionDetails)
或者
Html.RenderPartial(MVC.Definition.Views.DefinitionDetails, myModel)

4
我发现第一种方法需要在路径的末尾添加「.ascx」,但这可能只适用于特定的项目设置。 - andypaxo
2
仅仅需要明确一下,我们所说的是 System.Web.Mvc.Html.RenderPartialExtenstions 中的 Html.RenderPartial 重载方法,而不是 MvcContrib.UI.InputBuilder.Views.HtmlExtensions 或者 Microsoft.Web.Mvc.Html.HtmlHelperExtensions。有时候 Resharper 给你太多选择了。 - flipdoubt
3
是的,我尝试了第一种方法会产生错误,它应该有文件扩展名。因此它应该是Html.RenderPartial("~/Views/Controller/Action.ext"),其中ext可以是aspx、ascx、cshtml或vbhtml。 - CallMeLaNN
这个答案不是很正确。如果你提供了路径,你需要同时提供扩展名。如果你没有提供路径,你必须不提供扩展名。下面添加了详细的答案以澄清选项。 - iCollect.it Ltd
是的,@CallMeLaNN,你说得对,第一种方法会出现错误:“未找到部分视图'~/Views/Definition/DefinitionDetails'”,可以通过在末尾添加“ext”来解决。 - Dragon

14

仅澄清哪些选项确切有效:

1)如果您提供路径,则视图文件的扩展名是必需的。

2)如果您不提供路径,请不要提供扩展名。

以下示例假定使用cshtml文件。

在代码块中使用RenderPartial

// This looks in default view folder, then shared, checking for .aspx, .cshtml etc
Html.RenderPartial("DefinitionDetails"); 

// This looks in specified path and requires the extension
Html.RenderPartial("~/Views/Definition/DefinitionDetails.cshtml");

使用 Partial 支持 Razor 内联语法:

// This looks in default view folder, then shared, checking for .aspx, .cshtml etc
@Html.Partial("DefinitionDetails")

// This looks in specified path and requires the extension
@Html.Partial("~/Views/Definition/DefinitionDetails.cshtml")

注意: 显然,RenderPartialPartial稍微快一些,但我也期望使用完整路径的名称会比让MVC搜索文件更快。

如果您正在循环中生成部分视图(即来自视图模型中的集合),则可能需要通过特定的视图模型传递:

例如:

   @foreach (var group in orderedGroups)
   {
       Html.RenderPartial("~/Views/ControllerName/ViewName.cshtml", group);
   }

我刚刚在一个项目中不得不做所有这些事情,并发现标记的答案有点误导。


我可以在操作方法中使用Html.RenderPartial("~/Views/Definition/DefinitionDetails.cshtml", model)来生成字符串吗? - Himalaya Garg
@HimalayaGarg 这只是一个函数。您可以像使用任何返回字符串的函数一样使用它 :) - iCollect.it Ltd

1

你能不能把这些 partials 复制到 shared 文件夹中,然后只需要这样做:

<% Html.RenderPartial("DefinitionDetails", i); %>

<% Html.RenderPartial("DefinitionEditActions"); %>


既然你想从多个控制器访问视图,我会这么说。 - ridecar2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接