UserControl等效于MVC3?

时间:2011-01-27 00:20:24

标签: c# asp.net-mvc asp.net-mvc-3

在Web表单上,我们有UserControls。这些控件具有代码隐藏功能,可以在不依赖于其他内容的不同项目/解决方案中使用。

我想创建一个控件来呈现一些控件,并且会有一些“触发事件”的链接。我希望它们不会附在我的网站上,我希望能够在另一个网站上使用相同的“控件”。 MVC中的等价物是什么?是否可以使用控制器编译视图并在其他地方使用DLL?

2 个答案:

答案 0 :(得分:17)

MVC中与WebForms风格的可重用用户控件最接近的功能是html帮助程序。 html帮助器是一种返回一些标记的方法。建议的方法是以HtmlHelper之外的扩展方法或MVC页面的其他属性的形式实现它们:

public static IHtmlString MyControl(this HtmlHelper helper, string value) {
    return new HtmlString("<p>" + value + "</p>");
}

您可以直接将此方法添加到MVC项目中,也可以将其添加到单独的类库中。类库需要引用的唯一内容是HtmlHelper引用的System.Web.Mvc.dll(如果使用更多类型,它可能还需要System.Web.dll)。

你通常从你的视图中调用它们(这个例子使用了MVC 3中新增的Razor语法)

@Html.MyControl("my value")

虽然表面上的html助手像User Control一样发出标记,但是存在显着差异。最重要的一点是MVC视图没有WebForms页面生命周期的概念。这意味着与用户控件不同,html助手会在一次传递中呈现。 WebForms中没有多个阶段,如Init,Load,Render等,您可以在其中连接服务器端事件以与页面上的其他控件进行交互。

根据您所讨论的特定类型的事件,可能有适当的以MVC为中心的技术来解决您的任务。你能提供更多关于你想做什么的细节吗? Html助手可以非常强大。例如,像TextBoxFor这样的内置MVC输入控件可以连接客户端验证等。

答案 1 :(得分:3)

由于“事件”在MVC中与在WebForms中的存在方式不同,因此满足您的所有要求将非常棘手。

对于UserControl等效的UI层,您应该使用PartialView,可能位于Views / Shared / Templates文件夹中,具体取决于您是否希望它与某个Model类型相关联。

对于后端(“事件”),您可能应该实现一个Controller,您可以从链接发送请求,并支持您需要的所有行为。

要在各种项目中使用这些功能,您必须同时复制控制器和模板/局部视图。不可否认,重新使用它可能并不像WebForms的全部用户控件一样简单,但这是一个明确的关注点分离的限制,这在基于层的精心设计的基础上很明显WebForms应用程序也是如此。

更新以回应对我提到的关注点分离的“限制”的评论:
控制器当然可以分布在一个单独的组件中,它有自己的测试组件等。但是,包括控制器组件(或组件)带有前端代码的局部视图/模板可以说是一个更多的事情要做(即可能做不到),而不仅仅是复制用户控件的代码隐藏(存储在彼此旁边)。