避免在int字段MVC3上进行验证

pol*_*ata 0 validation data-annotations asp.net-mvc-3

我有以下ViewModel(只显示一些易于阅读的属性)

public class Contract{

public string Name {get; set;}

public ContractTerm PrpTerm { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

PRP Term模型就是这样的

public class PrpTerm{

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

}
Run Code Online (Sandbox Code Playgroud)

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

当我试图保存时,我将该ModelState.IsValid属性视为false,表示该PRPTerm.Id值是必需的.据我所知,因为我们无法为int赋值空值.

有人知道一种方法可以避免这种情况得到验证吗?

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

任何的想法?

Sta*_*anK 9

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

此行为可在MVC中使用

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes

默认为true.

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

然而,正如AFinkelstein所指出的,听起来真正的问题在于你的ViewModel.我建议你重新考虑一下,而不是关闭这个方便的MVC默认值.

我会建议

public class Contract
{
    public string Name { get; set; }
    public int? PrpTermId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

可能是你真正想要的.就这样做的"正当理由"而言 - 通常认为您的ViewModel通常会与您的模型不同,因为给定ViewModel的目的可能与它所构成的模型的目的略有不同.