3

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

我有一个关于 ASP MVC 验证的问题。假设我有以下视图模型

public class PersonViewModel
{
    [Required]
    public string Name {get; set; }

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

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

使用 ASP MVC 验证时,是否有针对此类场景的解决方案?

4

4 回答 4

5

我似乎找到了解决方案:

if(EmailTurnedOff)
{
    this.ViewData.ModelState.Remove("Email");
}

然后当我打电话给 ModelState.IsValid 它会给我正确的答案

于 2013-03-27T10:19:25.710 回答
4

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

[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);
}
于 2013-03-27T09:31:18.760 回答
1

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

然后在 ViewModel 的底部添加一个类似这样的方法:

    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 添加到视图中的正确位置:

@Html.ValidationMessage("EmailErrorMsg")

快乐编码!

于 2019-04-12T19:23:31.053 回答
0

背负 groovejet,这就是我在控制器中使用条件[必需]而不是视图模型的方式。我这样做是因为我只想忽略我的应用程序中的 [Required] 一项操作。

    public ActionResult Update(MyViewModel mVM)
    {
        if(mVM.Role == "Role" && mVM.Property == null)
        {
            ModelState.Remove("Property");
        }
        if (ModelState.IsValid)
        {
           // code...
        }
     }
于 2016-07-29T18:40:06.400 回答