我有以下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,但我需要用正当理由来证明这一变化。
有什么想法吗?
答案 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的验证,因为它不属于您的视图模型。