MVC 中模型的条件验证

2023-12-25

我有一个视图和模型,用于记录的编辑和插入页面。业务需求之一是某个字段在编辑时需要,但在新建时不需要。最初,在将此特定功能添加到待办事项中之前,我的模型如下:

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

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

EDIT

我应该澄清的是,他们仍然可以在新产品上插入成本,只是不是必需的。


如果您使用的是 MVC3/.NET4,则可以使用IValidatableObject专门为此目的而存在。

Quoting ScottGu http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx,

...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.");
        }
    }
}

然后在控制器中,

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

否则,最干净的解决方案是使用视图模型 -UpdateViewModel需要该财产的地方,以及CreateViewModel不需要的地方。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVC 中模型的条件验证 的相关文章

随机推荐