UserControl等效于MVC3?

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

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

与MVC中WebForms风格的可重用用户控件最接近的function是html帮助器。 html帮助器是一种返回一些标记的方法。 建议的方法是在HtmlHelper或MVC页面的某些其他属性的扩展方法的forms下实现它们:

 public static IHtmlString MyControl(this HtmlHelper helper, string value) { return new HtmlString("

" + value + "

"); }

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

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

 @Html.MyControl("my value") 

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

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

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

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

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

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

针对我提到的关注点分离“限制”的评论进行更新
控制器当然可以分布在一个单独的组件中,它有自己的测试组件等。但是,包括控制器组件(或组件) 带有前端代码的局部视图/模板可能还有一件事要做(即可能没有做到)只是复制一个用户控件与它的代码隐藏(彼此相邻存储)。