Asp.net mvc ASP.NET MVC 3模型的部分验证

Asp.net mvc ASP.NET MVC 3模型的部分验证,asp.net-mvc,validation,Asp.net Mvc,Validation,我有一个非常大的60多个问题的表单,用户可以开始填写,在任何时候保存并保留它。表单可以从数据库中重新加载并随时完成,然后关闭它 我有以下型号: public class Questionnaire{ [Required] public string Question1 { get; set; } [Required] [Range(1, 10)] public int Quesiton2 { get; set; } public string Question3 {

我有一个非常大的60多个问题的表单,用户可以开始填写,在任何时候保存并保留它。表单可以从数据库中重新加载并随时完成,然后关闭它

我有以下型号:

public class Questionnaire{

  [Required]
  public string Question1 { get; set; }

  [Required]
  [Range(1, 10)]
  public int Quesiton2 { get; set; }

  public string Question3 {get;set}
}
当用户决定保存表单时,我需要部分验证我的模型,并在用户选择关闭表单时执行完整验证,包括所需文件的验证


实施它的最佳方式是什么

您可以有两个单独的操作Save()和Submit(),并在Save()上禁用验证(或执行最小验证)

你为什么使用问题1。。问题。。每个问题1个对象,如果添加一个新问题怎么办?。。。您应该有一个问题列表,然后根据业务规则在保存之前手动验证

从您的问题/示例中还不完全清楚您到底需要什么,但我发现通常在MVC中拆分视图模型是解决这类问题的最佳方法

i、 e.将实体拆分为多个部分,每个部分都可以单独验证

然后使用局部视图/自定义编辑器模板为每个视图提供UI组件

然后,您可以在需要时将这些组件组合在一个表单中,或者根据需要在同一页上提供单独的表单、多页向导、单页渐进式AJAX向导或其他任何形式

使事情保持干爽和简单

关键是在需要时,不要害怕添加额外的视图模型层,以使数据对象符合UI的要求


当您特别需要摆脱业务对象/实体时,不要受到它们的约束-将业务对象的各个部分从组成视图模型片段中重新组合起来非常容易

根据Bala R的想法,最好根据正在执行、保存或提交的操作执行条件验证。 我的意思是,在保存时,只验证字段中的数据,因此检查空值/空值/默认值,不验证这些字段,而是根据已输入字段的业务逻辑/模型规则验证这些字段

因此,假设您有一个包含名称、年龄和性别的表单,在尝试1时,用户将其名称填写为“1234”,年龄填写为“12”,并将“sex”留空,保存时,您需要遍历每个控件并验证那些具有值的控件,在本例中为name和age,然后您可以验证名称并报告“1234”不是有效名称,但是接受12岁


您可能更适合在服务器端执行此操作,因为如果您尝试验证此客户端,则很难区分保留为空的必填字段(打算稍后填写)和保留为空的字段(句号)。(您可能会争辩说,您需要客户端Save()和Submit()验证函数来解决这个问题,服务器端也是如此)。

这就是我的想法,在Save()操作中,我将使用ModelState.IsValid,但是我应该如何实现Submit()操作验证?我希望在非空字段上验证除[Required]之外的所有属性