【问题标题】:Avoid validation on int field MVC3避免对 int 字段 MVC3 进行验证
【发布时间】:2012-05-03 16:13:17
【问题描述】:

我有以下 ViewModel(为了便于阅读,只显示了一些属性)

public class Contract{

public string Name {get; set;}

public ContractTerm PrpTerm { get; set; }

}

PRP Term 模型是这样的

public class PrpTerm{

public int Id {get; set;}
public string Name {get; set;}

}

对于我的模型验证,我使用 XML 文件来注入注释。我已经根据需要设置了Name 属性,并且我让ContractTerm 没有指定任何验证(它是列表中的可选字段)。我的观点是有一个名称的文本框和一个合同条款的选择列表。

当我尝试保存时,我将 ModelState.IsValid 属性设置为 false,表示需要 PRPTerm.Id 值。我知道这是因为我们无法将 null 值分配给 int。

有人知道避免这种情况被验证的方法吗?

我尝试使用 Bind(Exclude 注释,但这会从数据提交中删除该字段,并且这不允许我获取用户选择的值(如果发生这种情况)。我无法将 id 设置为可为空在 PrpClass 上。另一个选项是在 ViewModel 上设置 PrpTerm Id,但我需要用正当理由证明该更改是合理的。

有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc-3 validation data-annotations


    【解决方案1】:

    一个隐式的[Required] 属性应用于Id,因为它是一个int,根据定义,它是不可为空的(与int? 是可空的相反)。

    此行为可在 MVC 中使用

    进行配置

    DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes

    默认为真。

    您可以通过在 Global.asax.cs 中将其设置为 false 来禁用此行为

    但是,正如 AFinkelstein 指出的那样,听起来真正的问题在于您的 ViewModel。我建议您重新考虑这一点,而不是关闭这个方便的 MVC 默认设置。

    我建议

    public class Contract
    {
        public string Name { get; set; }
        public int? PrpTermId { get; set; }
    }
    

    可能是你真正想要的。就这样做的“正当理由”而言 - 人们普遍认为您的 ViewModel 通常与您的 Model 不同,因为给定 ViewModel 的目的可能与它所组成的 Model 的目的略有不同。

    【讨论】:

      【解决方案2】:

      听起来 PrpTerm 类不适合您的视图模型,因为您没有使用它的属性。您真正想要的只是从下拉列表中设置的 PrpTermName。我会有一个像

      这样的类结构
      public class Contract
      {
          public string Name { get; set; }
          public string PrpTermName { get; set; }
          public SelectList ContractTermList { get; set; }
      }
      

      现在您无需担心 ID 的验证,因为它不是您的视图模型的一部分。

      【讨论】:

      • 实际上,我从视图中得到的是从该列表中选择的 id。我知道在视图模型上使用该术语的名称或 ID 将是最佳选择,但我找不到与“验证不起作用”不同的参数:(
      • 不包括它的论点是视图模型应该只包含您需要的属性和子视图模型。在这种情况下,您尝试使用下拉列表绑定多个属性类,根据设计,它只允许您指定一个属性。在 ViewModel 中只包含一个与您需要的下拉列表 id 相对应的属性是最有意义的。您可以在发布后使​​用此属性在控制器中获取 PrpTerm 类(或等效的域类)。
      猜你喜欢
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多