加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 对MVC中的模型进行条件验证

发布时间:2020-12-15 23:49:09 所属栏目:asp.Net 来源:网络整理
导读:我有一个视图我用于编辑和插入页面一个记录的模型.业务需求之一是编辑需要某个字段,而不是新的.最初在这个特殊功能之前添加到这个文件夹中,我有这样的模型: [Required(ErrorMessage = "*")][Range(0.0,(double)decimal.MaxValue)][DisplayName("Cost")][Dis
我有一个视图&我用于编辑和插入页面一个记录的模型.业务需求之一是编辑需要某个字段,而不是新的.最初在这个特殊功能之前添加到这个文件夹中,我有这样的模型:
[Required(ErrorMessage = "*")]
[Range(0.0,(double)decimal.MaxValue)]
[DisplayName("Cost")]
[DisplayFormat(DataFormatString = "{0:d}",ApplyFormatInEditMode = true)]
public decimal ProposedCost { get; set; }

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

编辑

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

解决方法

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

报价ScottGu,

…The IValidatableObject interface enables you to perform model-level
validation,and enables you to provide validation error messages
specific to the state of the overall model….

你的模型看起来像

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读