ASP.NET MVC-如何实现可重用的用户控件并保持干燥?

ASP.NET MVC-如何实现可重用的用户控件并保持干燥?,asp.net,asp.net-mvc,user-controls,dry,Asp.net,Asp.net Mvc,User Controls,Dry,第一篇帖子,所以请温柔:) 在ASP.NET MVC中创建用户控件时,构造代码的最佳方法是什么,以便调用使用用户控件的视图的控制器不必都对控件了解太多?我想知道在ASP.NET MVC中使用用户控件时保持干燥的好方法 请注意,此问题仅适用于需要特殊处理和回发逻辑的用户控件。我可以为用户控件创建漂亮的干代码,这些控件要么是纯视图(使用RenderPartial),要么需要一些预处理来创建适当的ViewModel(使用RenderAction) 此外,这个问题只涉及在应用程序中实现可重用控件。此时,

第一篇帖子,所以请温柔:)

在ASP.NET MVC中创建用户控件时,构造代码的最佳方法是什么,以便调用使用用户控件的视图的控制器不必都对控件了解太多?我想知道在ASP.NET MVC中使用用户控件时保持干燥的好方法

请注意,此问题仅适用于需要特殊处理和回发逻辑的用户控件。我可以为用户控件创建漂亮的干代码,这些控件要么是纯视图(使用RenderPartial),要么需要一些预处理来创建适当的ViewModel(使用RenderAction)

此外,这个问题只涉及在应用程序中实现可重用控件。此时,我并不担心应用程序之间的可重用性

举一个具体的例子,假设我想创建一个“快速添加”用户控件,它包含三个输入字段:名字、姓氏和公司名,以及一个提交按钮。使用QuickAdd功能时,应独立于控件所在的页面执行以下步骤:

  • 验证字段是否为空,如果为空,则显示一个指示符
  • 查找存储库,查看该公司是否已经存在(如果不存在);创造它
  • 创建与现有公司或新创建的公司关联的新联系人
  • 重新呈现现有页面。如果没有验证错误,用户将再次看到完全相同的页面,否则将看到带有验证错误的相同页面
  • 实现DRY的主要问题是,所有调用包含部分视图的视图的控制器最终都必须有一个操作方法来处理来自快速添加的表单提交。即使我将处理信息的逻辑分解到一个单独的控制器中,并从其他每个控制器调用该方法,调用具有可重用控件的视图的每个控制器都必须具备该知识,这似乎是一个负担

    我看到的另一个选项是让可重用控件始终提交给特定的操作方法/控制器,但该控制器无法知道如何为调用包含可重用控件的视图的特定控制器适当地重新填充模型(在步骤4中)

    我知道在MVC2中有关于分包商的讨论(从这个问题开始),但既然还没有,那么在保持干燥的同时构造代码以实现最大可重用性的最佳方法是什么


    除了调用使用可重用控件(具有上述特性)的视图的所有控制器之外,还有其他选择吗,必须有一个操作方法来处理来自控件的信息?

    我不知道为什么您说快速添加表单必须在使用它的每个控制器中有一个操作方法;如果将快速添加功能包装在Html.BeginForm()中;在Html.EndForm()组合中,您可以让beginform方法指定操作和控制器的名称,因此您只需要一个控制器

    我知道你来自哪里;这是我一直想做的事。虽然我不知道所有的答案,我有一些想法让你考虑。每个控制器操作方法都通过ControllerActionInvoker类调用,您可以自定义该类。这个类处理所有动作方法的调用,所以这里您可以将可重用代码的某些方面嵌入到所有或某些动作方法中

    也要研究过滤器,因为有各种各样的过滤器可以使用或自定义,这些过滤器为实现它的操作方法触发。这样,代码可以在操作方法执行和结果执行之前和之后运行

    对于验证,已经内置了可防止页面提交的验证组件。。。你也可以考虑XVAL,它还有其他一些好的特性。Unity框架是一个IOC容器框架,动态注入使事情保持松散耦合和干燥,因为您可以注入各种引用

    另外,你提到了分包商;MVC预览版具有您可能感兴趣的其他功能。。。例如,它有一个RenderAction方法,可以在另一个动作的视图中呈现动作方法


    希望这有帮助。。。那么我遗漏了什么呢?

    看看RenderAction和RenderPartial。这些是将公共控件任意注入视图的规范方法

    如果要将数据作为ViewData基础结构的一部分,请使用RenderPartial

    如果希望数据与ViewData基础结构分离,请使用RenderAction。数据将来自您在RenderAction中指定的控制器方法


    如果您还没有阅读过NerdDinner教程,请查看这些教程。

    在文章的最后,您会问“除了拥有所有控制器……拥有一个操作方法来处理来自控件的信息之外,还有其他选择吗?”

    这个问题的答案是编写一个自定义模型活页夹。自定义模型绑定器可以负责将传入表单控件中的值填充到所有控制器使用的模型或属性中。通常,您希望将验证与模型绑定分离,但没有理由不能将它们组合在一起


    我强烈建议对该主题进行更深入的讨论,并提供一些很好的参考资料。

    是的,RenderAction有助于实现独立的控件,并在渲染之前为用户控件创建一个专门的ViewModel,但RenderPartial或RenderAction都没有用(或者说不适用)当需要独立控件来处理回发上用户控件的内容时。感谢您的回复,我将接受lo