首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP MVC中ViewModel字段的条件验证

ASP MVC中ViewModel字段的条件验证
EN

Stack Overflow用户
提问于 2013-03-27 17:26:47
回答 4查看 5.3K关注 0票数 3

标题: ASP上ViewModel字段的条件验证

我有一个关于ASP MVC验证的问题。假设我有下面的View Model

代码语言:javascript
复制
public class PersonViewModel
{
    [Required]
    public string Name {get; set; }

    [Required]
    public string Email {get; set; }
}

根据这一点,当我提交表单时,MVC将验证两个字段是否都有值。但是,在我的网站中,可以在全局站点设置中关闭电子邮件,因此模型将只在表单上呈现名称Textbox。现在,当我提交表单时,它仍然要求我提供电子邮件字段,因为它被指示为“必填”,尽管用户现在无法填写该字段。

在使用ASP MVC验证时,有没有针对这种情况的解决方案?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-27 18:19:26

我似乎找到了解决方案:

代码语言:javascript
复制
if(EmailTurnedOff)
{
    this.ViewData.ModelState.Remove("Email");
}

然后,当我调用ModelState.IsValid时,它会给出正确的答案

票数 5
EN

Stack Overflow用户

发布于 2013-03-27 17:31:19

解决方案是,如果设置了这样的设置,则必须去掉Email字段上的Required属性,并在post时自己执行验证。像这样的东西

代码语言:javascript
复制
[HttpPost]
public ActionResult Post(PersonViewModel model)
{
    //replace EmailTurnedOff with your setting
    if (!EmailTurnedOff && string.IsNullOrWhiteSpace(model.Email))
    {
        ModelState.AddModelError("Email", "Field is Required");
    }

    if (ModelState.IsValid)
    {
        //do whatever
    }

    return View(model);
}
票数 4
EN

Stack Overflow用户

发布于 2019-04-13 03:23:31

可以从ViewModel执行条件验证。ViewModel类将需要实现IValidatableObject接口。

然后在ViewModel的底部添加一个类似以下内容的方法:

代码语言:javascript
复制
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (validationContext == null)
            return null;

        var valResults = new List<ValidationResult>();

        if (!EmailExists))
            valResults.Add(new ValidationResult($"Email is required.", new[] { "EmailErrorMsg" }));

        return valResults;
    }

不要忘了在视图中的正确位置添加一个ValidationMessage:

代码语言:javascript
复制
@Html.ValidationMessage("EmailErrorMsg")

祝你编码愉快!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15655415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档