我在Monorail中构建的一些较大的应用程序中大量使用View Components - ASP.Net MVC中的视图组件的等效方法是什么,可以支持各个部分等等。 p>
答案 0 :(得分:2)
实际上,您有几个选项可以在ASP.NET MVC中创建等效的ViewComponent,具体取决于组件的复杂程度。我使用这两种方法,这是我所知道的选项中的mvc-ish。
<强> 1 强> 最简单的方法是创建一个ViewUserControl并使用Html.RenderPartial和帮助器显示它。 ViewUserControl是一个简单的标记,没有后备控制器(如果你愿意,我想你可以放一个代码隐藏文件)。 (可选)您可以在调用RenderPartial时将模型对象或整个ViewData字典传递给视图,如下所示:
<% Html.RenderPartial("TopBar", model); %>
“TopBar”是一个ascx页面。这适用于任何地方,母版页和普通视图中。
2: 如果您希望组件具有更复杂的逻辑或访问数据源,IoC等,那么您可以使用Html.RenderAction,它是Microsoft.Web.Mvc程序集中的扩展方法。我在mvccontrib发行版中使用它。它的工作原理如下,您需要创建一个包含所需逻辑的普通控制器,然后创建一些视图,所有这些都成为您的组件,例如:
public class AboutComponentController : Controller {
public IRepository Repository{ get; set; }
public ActionResult Detail() {
var lastEvent = Repository.FindAll<Auditoria>().FirstOrDefault();
return View(lastEvent);
}
}
请注意我如何引用一个IRepository,它将注入IoC(在我的情况下是Windsor),我可以做普通控制器所做的任何事情。
现在,在要使用组件的任何页面(主页或普通页面)中,导入Microsoft.Web.Mvc并使用适当的参数调用Html.RenderAction。这将创建一个mini mvc管道,用于创建控制器,解析视图等,就像Monorail ViewComponent一样。我更喜欢使用方法的基于lambda的变体,如下所示:
<% Html.RenderAction<AboutComponentController>(x => x.Detail("a message"));%>
不幸的是,传递参数的唯一方法是使用方法调用本身,而调用本身在控制器中必须是唯一的。仍然需要一些工作来像ViewComponent。
我不在组件的视图中使用masterpages或layouts,因为它们本身就是组合元素。
请记住,在使用Webforms视图引擎时,如果您希望在代码块中使用Model变量时具有智能感知,则可以使用强类型视图。
这样做的好处是你可以将视图引擎与这些方法混合在一起,我通常用nvelocity创建组件并在aspx页面中显示它们等。
我现在可能存在缓存部分视图的问题,但到目前为止我还没有遇到任何问题。我确信还有其他选项(比如mvccontrib中的子控制器),但这对于简单的情况通常就足够了。当然你可以在你的aspx视图页面中使用普通的ASP.net组件,但那会欺骗吗?呵呵。我希望它有所帮助。
答案 1 :(得分:0)
Phil Haack blogged关于创建区域以将控制器分组到类似于MonoRails的子文件夹/部分。