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

use*_*255 12 asp.net asp.net-mvc user-controls dry

首先发帖所以请温柔:)

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

请注意,此问题仅适用于需要在回发上进行特殊处理和逻辑的用户控件.我没有问题为用户控件创建好的DRY代码,这些用户控件既可以是视图(使用RenderPartial),也可以需要一些预处理来创建适当的ViewModel(使用RenderAction).

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

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

  1. 验证字段不为空,如果是,则显示指示符.
  2. 对存储库执行查找以查看公司是否已存在,如果不存在; 创造它.
  3. 创建与现有公司或新创建的公司关联的新联系人
  4. 重新渲染现有页面.如果没有验证错误,用户将再次看到完全相同的页面,否则同一页面会出现验证错误.

实现DRY的主要问题与调用包含局部视图的视图的所有控制器有关,最终必须有一个Action方法来处理来自Quick Add的表单提交.即使我将用于处理信息的逻辑分解为单独的控制器并从每个其他控制器调用该方法,但是调用具有可重用控件的视图的每个控制器都必须具有该知识,这似乎是一种负担.

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

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

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

Chr*_*inn 2

在帖子的末尾,您会问“除了必须拥有所有控制器之外,还有其他选择吗……必须有一个操作方法来处理来自控件的信息

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

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