2010-03-09 36 views
4
<body> 
<div id="header"> 
<div class="title">SPORTS STORE</div> 
</div> 
<div id="categories"> 
<% Html.RenderAction("Menu", "Nav"); %> 
</div> 
<div id="content"> 
<asp:ContentPlaceHolder ID="MainContent" runat="server" /> 
</div> 
</body> 

这是Steven Sandersons的书“Pro ASP.NET MVC Framework”的示例代码。如何使用Controller和Action在asp.net mvc 2中渲染部分视图?

此代码适用于MVC V1和MvcContrib。它做了什么,它呈现了“Nav:Controller”的“Menu()”视图。由于ASP.NET MVC V2包含Partial()和RenderPartial()功能,因此我试图实现它,但此代码不起作用。我试图修改它在几个方面,但似乎没有呈现局部视图,以作为参数过载功能: 1)控制器的名字 2)查看名称

我敢肯定,我不是第一人谁在以这种方式实现RenderAction(),所以必须有一种解决方法。请帮忙。

回答

4

我发现了这个问题。我总是删除{controller}/{action}路线并使用小写REST类似URL来定制我的所有路线。但是对于Html.RenderAction,有必要有这样的一般路由。我将这条通用路线添加到我的路线列表末尾,并且工作正常。 - 马赫迪2月22日在14:42

虽然我还是不明白,这是如何工作,为什么吸盘路线nessesary,什么是路线的约束。也许我会在稍后做一些研究。

+0

这是因为RenderAction与通过路由最初映射控制器动作时发生的情况更为接近。我同意如果一个人不能暴露路线,但仍然有RenderAction的工作将会很好。与此同时,您只能公开该特定路由,将[ChildActionOnly]放在这些操作上,并且不会有默认路由。正如你所暗示的,在路由约束下,你可以减少路由的存在对你的可用“路由命名空间”(大多数情况下不是问题,而是部分CMS的站点的一个重要考虑因素)的影响。 – Cymen 2010-03-26 18:06:56

1

RenderAction在MVC2中(docs here)。这听起来像你已经改变了你的代码来使用RenderPartial而不是完全不同。将其改回使用RenderAction,你应该没问题。如果你的版本中没有它,也许你需要更新到最新的测试版?

+0

嗨tvanfosson, 感谢您的回复。 我之前尝试过RenderAction,它会抛出一个异常,如“在rotes表中找不到可变路径”。添加任何额外的rotes似乎不合理,因为我没有使用route:Controller和View被调用Direclty,对吧? 谢谢,伊利亚。 – 2010-03-09 14:02:53

+0

RenderAction有一个签名,按照该顺序采取操作和控制器。你的代码看起来是正确的 - 你有最新的MVC2测试版吗?是否有可能与MVCContrib库存在冲突 - 我应该从你的项目中删除它。 – tvanfosson 2010-03-09 14:13:00

+0

我没有提及MVCContlib。我也肯定会有最新版本的MVC,它包含在MS VS 2010 RC Ultimate中。更多信息将在几个小时内提供。 谢谢你这样的快速回复,tvanfosson。 – 2010-03-09 14:43:46