如何实现可重用的用户控制并保持DRY?

所以请首先发帖温柔:)

在ASP.NET MVC中创建用户控件时,构建代码的最佳方式是什么,以便调用使用用户控件的视图的控制器不必都非常了解这些控件? 我想知道在ASP.NET MVC中使用用户控件时保持DRY的好方法。

请注意,此问题仅适用于需要特殊处理和回发逻辑的用户控件。 我没有问题为用户控件创建漂亮的DRY代码,这些代码只能查看(使用RenderPartial)或需要一些预处理来创建适当的ViewModel(使用RenderAction)。

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

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

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

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

    我知道有关于MVC 2中的子控制器的讨论(从这个问题来看ASP.NET MVC - 包含用户控件),但由于它不存在,在保持DRY的同时,构造代码以实现最大可重用性的最佳方式是什么?

    是否有必须让所有使用可重用控件的视图的控制器(具有上述特性)必须拥有一个Action方法来处理来自控件的信息?


    在帖子结尾处,您问“是否有必须让所有控制器......必须有一个操作方法来处理来自控制器的信息”的替代方案“

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

    我强烈推荐ASP.NET MVC模型绑定的6个技巧,以深入讨论该主题以及一些很好的参考。


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

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

    也可以查看过滤器,因为您可以使用各种过滤器,或者为实现它的操作方法自定义这些过滤器。 这样,代码就可以在操作方法执行和结果执行之前和之后运行。

    对于验证,已经有内置的验证组件可以阻止页面提交......你也可以考虑有其他一些不错的功能的XVAL。 Unity框架是一个IOC容器框架,动态注入使事物松散耦合并干燥,因为您可以注入各种引用。

    另外,你提到了子控制器; MVC预览包含您可能感兴趣的附加功能......例如,它具有一个RenderAction方法,可以在另一个操作的视图中呈现操作方法。

    希望这有助于......所以我错过了什么?


    看看RenderAction和RenderPartial。 这些是任意将一个共同控制注入视图的规范方法。

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

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

    查看NerdDinner教程,如果您还没有这样做。

    链接地址: http://www.djcxy.com/p/21495.html

    上一篇: How to achieve reusable user controls and maintain DRY?

    下一篇: Windows doesn't write crashdumps for process with low integrity level