MVC中模型的条件验证

Set*_*eth 16 asp.net-mvc

我有一个视图和模型,我用于记录的编辑和插入页面.其中一个业务要求是编辑时需要某个字段,而不是新字段.最初在这个特殊功能被添加到文档之前,我有这样的模型:

[Required(ErrorMessage = "*")]
[Range(0.0, (double)decimal.MaxValue)]
[DisplayName("Cost")]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
public decimal ProposedCost { get; set; }
Run Code Online (Sandbox Code Playgroud)

如果是插入表单,我想删除所需的属性,或者如果是编辑表单,则添加它.什么是更好的方法?我的所有其他验证都是如上所述完成的.或者我可以改变模型状态吗?思考?

编辑

我应该澄清的是,他们仍然被允许在新的成本上插入,只是不需要.

and*_*ter 34

如果您使用的是MVC3/.NET4,则可以使用IValidatableObject专门用于此目的的文件.

引用ScottGu,

... IValidatableObject接口使您能够执行模型级验证,并使您能够提供特定于整个模型状态的验证错误消息....

你的模特看起来像

public class MyViewModel : IValidatableObject
{
    public long? Id { get; set; }
    public decimal? ProposedCost { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
        if (Id != null && ProposedCost == 0) {
            yield return new ValidationResult("ProposedCost must be provided.");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在控制器中

[HttpPost]
public ActionResult Submit(MyViewModel model)
{
    if (!ModelState.IsValid) {
        //failed - report an error, redirect to action etc
    }
    //succeeded - save to database etc
}
Run Code Online (Sandbox Code Playgroud)

否则,最干净的解决方案是使用视图模型 - UpdateViewModel需要属性的CreateViewModel地方,以及不需要的地方.