【问题标题】:Conditional Validation for ViewModel Fields on ASP MVCASP MVC 上 ViewModel 字段的条件验证
【发布时间】:2013-03-17 07:57:04
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: c# asp.net-mvc validation web


【解决方案1】:

我好像找到了解决办法:

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

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

【讨论】:

  • 遇到了同样的问题,这是非常简单的解决方案。天才!
【解决方案2】:

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

[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);
}

【讨论】:

    【解决方案3】:

    可以从 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")
    

    编码愉快!

    【讨论】:

    • 我希望这个答案也不会被标记,因为它确实与问题相关。最好使用视图模型而不是控制器操作来保持条件验证,原因有两个。 1 - 整理控制器动作。 2 - 如果您在其他地方重用视图模型,则无需在另一个控制器操作中复制条件验证。和平。
    【解决方案4】:

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

        public ActionResult Update(MyViewModel mVM)
        {
            if(mVM.Role == "Role" && mVM.Property == null)
            {
                ModelState.Remove("Property");
            }
            if (ModelState.IsValid)
            {
               // code...
            }
         }
    

    【讨论】:

      猜你喜欢
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      相关资源
      最近更新 更多