Asp.net mvc ASP.NETMVC框架是否有与单轨视图组件等效的组件?

Asp.net mvc ASP.NETMVC框架是否有与单轨视图组件等效的组件?,asp.net-mvc,castle-monorail,castle,Asp.net Mvc,Castle Monorail,Castle,我在Monorail中构建的一些更大的应用程序中大量使用了它-在ASP.Net MVC中,视图组件的等效方法是什么,可以支持分区等吗?Phil Haack关于创建区域以将控制器分组到类似Monorail的子文件夹/分区中。实际上,根据组件的复杂性,您有几个选项可以在ASP.NET MVC中创建等效的ViewComponent。我使用这两种方法,这两种方法都是我所知道的mvc风格的选择 1: 最简单的方法是创建一个ViewUserControl,并使用Html.RenderPartial和帮助器显

我在Monorail中构建的一些更大的应用程序中大量使用了它-在ASP.Net MVC中,视图组件的等效方法是什么,可以支持分区等吗?

Phil Haack关于创建区域以将控制器分组到类似Monorail的子文件夹/分区中。

实际上,根据组件的复杂性,您有几个选项可以在ASP.NET MVC中创建等效的ViewComponent。我使用这两种方法,这两种方法都是我所知道的mvc风格的选择

1: 最简单的方法是创建一个ViewUserControl,并使用Html.RenderPartial和帮助器显示它。ViewUserControl是一个简单的标记,没有支持控制器(我认为如果需要,可以放置代码隐藏文件)。 (可选)调用RenderPartial时,可以将模型对象或整个ViewData字典传递给视图,如下所示:

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

“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存储库{get;set;}
公共行动结果详情(){
var lastEvent=Repository.FindAll().FirstOrDefault();
返回视图(lastEvent);
}
}

请注意,我是如何引用一个IRepository的,它将被注入IoC(在我的例子中是Windsor),我可以做任何正常控制器会做的事情

现在,在要使用组件的任何页面(主页面或普通页面)中,导入Microsoft.Web.Mvc并使用适当的参数调用Html.RenderAction。这将创建一个小型mvc管道,该管道创建控制器、解析视图等,就像单轨视图组件一样。我更喜欢使用基于lambda的方法变体,如下所示:

<% Html.RenderPartial("TopBar", model); %>
<% Html.RenderAction<AboutComponentController>(x => x.Detail("a message"));%>
x.Detail(“消息”);%
不幸的是,传递参数的唯一方法是使用方法调用本身,而方法调用本身在控制器中必须是唯一的。仍然需要做一些工作来模拟ViewComponent

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

请记住,在使用Webforms视图引擎时,如果希望在代码块中使用模型变量时使用intellisense,则可以使用强类型视图

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


我现在发现部分视图的缓存可能会有问题,但到目前为止我还并没有遇到任何问题。我确信还有其他选择(如mvccontrib中的分包商),但对于简单的情况,这通常就足够了。当然,您可以在您的aspx查看页面中使用普通的ASP.net组件,但这是作弊,对吗?呵呵。我希望这会有所帮助。

monorail中视图组件中的部分与区域不同,它们更像是视图组件在渲染时可以使用的命名项模板-请参阅ayende的帖子以获得良好的描述:感谢您的深入回复,我一直在使用partials,但尚未尝试渲染操作-看起来很有趣。不幸的是,它仍然不能真正帮助我替换我目前在Monorail中拥有/喜爱的视图组件,它大量使用了节()-看起来我可能需要做一些进一步的调查,看看是否有任何方法可以模拟这种行为。@Bitercoder您能找到任何关于使用大量节替换视图组件的方法吗?