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

时间:2012-05-03 16:13:18

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

我有以下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值。据我所知,因为我们无法为int赋值空值。

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

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

有什么想法吗?

2 个答案:

答案 0 :(得分: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; }
}

可能是你真正想要的。在一个有效的理由方面'要做到这一点 - 通常认为您的ViewModel通常会与您的模型不同,因为给定ViewModel的目的可能与它所构成的模型的目的略有不同。

答案 1 :(得分:1)

如果您没有使用其属性,则听起来PrpTerm类不适合您的View模型。你真正想要的只是一个下拉列表中的PrpTermName。我会有类似

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

现在您无需担心ID的验证,因为它不属于您的视图模型。