您将如何在ASP.NET MVC视图中支持外部可组合部分?
这是什么意思?想想"每个页面上的登录框"或"iGoogle".这些东西需要位于每个控制器/视图外部的某些位置.
一种方法是在视图中添加组件,如下所示:
<% foreach (var component in GetComponents()) {%> <%= Html.RenderPartial(component.ViewName, component.ViewData)%> <%} %>
在上面的示例中,我正在寻找一种方法,让每个组件的控制器提供viewname和viewdata,而不是显示它们的视图的控制器.您可以建议的任何完全不同的解决方案也会引起关注.过滤器,WebForms等
更新:我会试着用一个例子来解释我想要解决的问题.我会选择登录功能.
在典型的webforms应用程序中,这可以是一个用户控件,它在页面生命周期的load事件中检索适当的数据并更新一些UI控件.点击后页面将回发,我们可以在同一用户控件中的点击事件中对发布的信息进行操作.
从我目前对ASP.NET MVC样式的理解来看,首先接受请求的控制器将检索适当的数据并将其传递给视图,然后视图将其传递给登录部分视图.登录视图将定义一个表单,其后置操作指向登录控制器的登录操作.在发布信息时使用的登录操作,我们可以选择一起使用一些漂亮的方案,原来的控制器传递请求.
我假设有一种比上面更聪明的方法,不需要我将控制器逻辑放在视图/母版页中.
有两种方法可以做到这一点:
一:创建一个BaseController,始终获取这些组件所需的数据,设置ViewData ["loginbox"] = loginBoxData,然后你可以像这样传递它.
<% foreach (var component in GetComponents()) {%> <%= Html.RenderPartial(component.ViewName, ViewData[component.Name])%> <%} %>
关于这种方法的问题在于你需要有逻辑来说明何时将获取组件所需的所有这些数据,何时不去.
二:
有一个MVC Futures DLL,你可以从这里下载.
你引用它,并记得将它的命名空间添加到你的web.config,然后你应该能够说:Html.RenderAction("blah")
- 这个方法通过联系控制器,启动视图,并返回HTML来完成整个旅程.