我在Monorail中构建的一些较大的应用程序中大量使用了
View Components – ASP.Net MVC中对于视图组件的等效方法是什么,它可以支持部分等等? 最佳答案 实际上,您有几个选项可以在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组件,但那会欺骗吗?呵呵.我希望它有所帮助.