我在一些较大的Monorail应用程序中广泛使用视图组件 - 在ASP.Net MVC中,有没有类似的视图组件方法,可以支持区块等功能?
<% Html.RenderPartial("TopBar", model); %>
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。这将创建一个小型的mvc管道,创建控制器,解析视图等,就像Monorail ViewComponent一样。我喜欢使用基于lambda的方法变体,像这样:
<% Html.RenderAction<AboutComponentController>(x => x.Detail("a message"));%>
不幸的是,传递参数的唯一方法是使用方法调用本身,而该方法调用必须在控制器中是唯一的。仍需要一些工作来类似于ViewComponent。
我不在组件视图中使用主页面或布局,因为它们本身就是组合元素。
请记住,在使用Webforms视图引擎时,如果您喜欢在代码块中使用Model变量时具有智能感知,则可以拥有强类型视图。
这样做的美妙之处在于,您可以将视图引擎与这些方法混合使用,我通常会在nvelocity中创建组件并在aspx页面中显示它们等。
我知道部分视图的缓存可能存在问题,但我迄今为止还没有遇到过任何问题。我相信还有其他选项(例如mvccontrib中的子控制器),但这通常足以处理简单的情况。当然,您可以在aspx视图页面中使用普通的ASP.net组件,但那样就有点作弊了,对吧?哈哈。希望这有所帮助。
Phil Haack 发表了博客文章,介绍了如何创建区域来将控制器分组到子文件夹/部分中,类似于MonoRails。