ASP.Net MVC框架中是否有类似于Monorail视图组件的等效组件?

4

我在一些较大的Monorail应用程序中广泛使用视图组件 - 在ASP.Net MVC中,有没有类似的视图组件方法,可以支持区块等功能?

2个回答

2
实际上,您有几个选项可以在ASP.NET MVC中创建等效于ViewComponent的内容,具体取决于您组件的复杂度。我使用了以下两种方法,它们是我所知道的更适合MVC风格的选项。
1: 最简单的方法是创建一个ViewUserControl,并使用帮助程序的Html.RenderPartial来显示它。 ViewUserControl是一个简单的标记片段,没有后备控制器(如果需要,可以放置codebehind文件)。 可选地,在调用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。这将创建一个小型的mvc管道,创建控制器,解析视图等,就像Monorail ViewComponent一样。我喜欢使用基于lambda的方法变体,像这样:

<% Html.RenderAction<AboutComponentController>(x => x.Detail("a message"));%>

不幸的是,传递参数的唯一方法是使用方法调用本身,而该方法调用必须在控制器中是唯一的。仍需要一些工作来类似于ViewComponent。

我不在组件视图中使用主页面或布局,因为它们本身就是组合元素。

请记住,在使用Webforms视图引擎时,如果您喜欢在代码块中使用Model变量时具有智能感知,则可以拥有强类型视图。

这样做的美妙之处在于,您可以将视图引擎与这些方法混合使用,我通常会在nvelocity中创建组件并在aspx页面中显示它们等。

我知道部分视图的缓存可能存在问题,但我迄今为止还没有遇到过任何问题。我相信还有其他选项(例如mvccontrib中的子控制器),但这通常足以处理简单的情况。当然,您可以在aspx视图页面中使用普通的ASP.net组件,但那样就有点作弊了,对吧?哈哈。希望这有所帮助。


感谢您深入的回复,我一直在使用partials,但还没有尝试过render action - 看起来很有趣。不幸的是,这仍然无法真正帮助我替换掉我目前在Monorail中喜欢并且大量使用sections的视图组件(http://ayende.com/Blog/archive/2007/04/08/Building-View-Components-For-MonoRail.aspx) - 看起来我可能需要进一步调查是否有任何方法来模拟这种行为。 - Bittercoder
@Bittercoder,你有没有找到关于用大量部分替换视图组件的任何信息? - Tinister

0

Phil Haack 发表了博客文章,介绍了如何创建区域来将控制器分组到子文件夹/部分中,类似于MonoRails。


在Monorail中,视图组件中的“Sections”与“Areas”不同,它们更像是命名的项模板,可以在视图组件渲染时使用。请参阅Ayende的文章以获取良好的描述:http://ayende.com/Blog/archive/2007/04/08/Building-View-Components-For-MonoRail.aspx - Bittercoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接