在ASP.NET MVC中处理多个表单验证的最佳方法

时间:2010-09-28 13:20:27

标签: asp.net-mvc-2 validation model-validation

概述

我有一个付款页面,我允许用户选择付款方式,信用卡或支票。我有一个表格,每种付款方式。我不想为UI目的为每个方法创建一个单独的页面,所以我为每个表单使用[div]并使用jQuery切换它们的显示。

问题

每种付款方式都有自己的一套验证规则。我希望能够将模型验证仅应用于用户选择和提交的付款方式。为了进行验证,我需要POST到相同的控制器操作,因此不能选择提交不同的操作。

途径

我考虑过以下方法:

  1. 基于传入值的部分验证,如下所述:http://blog.stevensanderson.com/2010/02/19/partial-validation-in-aspnet-mvc-2/。我对这种方法的问题是安全隐含,因为这是一个相对较小的应用程序,我没有像文章作者所建议的那样单独的域层。
  2. 为每种付款方式创建单独的模型,然后使用不同的模型参数重载控制器[HttpPost]操作。我试过这个但是编译器抱怨说这个动作是模棱两可的,即使我有这样的东西

    [HttpPost]
    public ActionResult Pay(CreditCardPaymentModel model){...}

    [HttpPost]
    公共ActionResult Pay(CheckPaymentModel模型){...}

  3. 使用单独的控制器操作来处理各个表单帖子,并使用TempData设置验证消息并重定向回表单页面以显示消息。我真的不喜欢这个选项,因为它感觉很笨,而且我不喜欢将TempData用于除简单消息之外的任何其他内容。

  4. 我欢迎任何有关干净利落地处理这种情况的最佳方法的建议。

2 个答案:

答案 0 :(得分:0)

我会选择选项2,因为它可以让您在支付模型和具体模型类之间实现清晰,完整的分离(我总是选择强类型解决方案)。

选项2也很容易进行单元测试...

答案 1 :(得分:0)

我会选择策略3。

使用jQuery切换表单视图时,您还可以替换表单的post url。这样,它可以通过不同的控制器方法轻松处理,每个控制器方法都有自己的验证逻辑。

另一个选项(不是我喜欢的选项)是为两个付款选项创建合并模型。在实例化该模型后,您可以轻松区分哪种形式是活动的。或者您也可以使用jQuery设置一些隐藏值来指示活动表单视图。

P.S。对于#2,很难判断哪个模型实例化将在框架尝试实例化一个模型实例化并且如果它失败另一个模型实例化之前。这并不是那么简单,框架并不是为了那么聪明,而是为这个过程带来一些主动性。