0

我有以下 ViewModel(仅显示几个属性以便于阅读)

public class Contract{

public string Name {get; set;}

public ContractTerm PrpTerm { get; set; }

}

PRP 术语模型是这样的

public class PrpTerm{

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

}

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

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

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

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

任何的想法?

4

2 回答 2

9

一个隐式[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 的目的略有不同。

于 2012-05-04T04:09:12.127 回答
1

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

public class Contract
{
    public string Name { get; set; }
    public string PrpTermName { get; set; }
    public SelectList ContractTermList { get; set; }
}

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

于 2012-05-03T16:26:36.473 回答