【问题标题】:Remove object from modelstate validation从模型状态验证中删除对象
【发布时间】:2014-06-09 23:15:45
【问题描述】:

我有两个模型:

public class UserInfo
{
    public long ID { get; set; }

    [Required]
    [StringLength(50)]
    public string FirstName { get; set; }

    //...

    public bool Falg{ get; set; }
}

public class UserInfoExtra
{
    public long ID { get; set; }

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

    //...
}

这两个模型组合在一个 ViewModel 中:

public class UserViewModel
{
    public UserInfo UserInfo { get; set; }
    public UserInfoExtra ExtraInfo { get; set; }
}

在控制器中:

public ActionResult Create(UserViewModel userinfo)
{
    if(userInfo.Flag){
        //Remove ExtaInfo from validation in ModelState.IsValid?
    }
    if (ModelState.IsValid)
    {
        db.UserInfos.Add(userinfo);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(userinfo);
}

如何从ModelState.IsValid 的验证中删除ExtraInfo

【问题讨论】:

  • 您可以使用ModelState[key].Errors.Clear(); 删除个别错误
  • 您可以使用 Stephen 的评论,或者如果您启用了客户端验证,则使用 jquery 强制提交(表单)并在服务器端执行 ModelState[key].Errors.Clear();或 if(ModelState.IsValidField(UserInfo)){//userinfor 的模型状态有效}

标签: asp.net asp.net-mvc entity-framework


【解决方案1】:

ModelState 中删除错误不是一个好主意。如果您不希望在使用 UserViewModel 时验证 UserInfoExtra 类,那么您应该以不同的方式定义您的视图模型(如下所示),然后对 PhoneNumber 属性使用条件验证:

public class UserViewModel
{
    public UserInfo UserInfo { get; set; }
    public long ID { get; set; }
    //[RequiredIf] (conditional validation here)...
    public string PhoneNumber { get; set;}
}

在这里你可以找到RequiredIf属性的实现:RequiredIf Conditional Validation Attribute

【讨论】:

    【解决方案2】:
    1. 忽略其他属性(UserInfo 除外):ModelState.IsValidField(UserInfo)
    2. 清除/删除属性错误:ModelState["ExtraInfo"].Errors.Clear();
    3. 创建自定义验证器,同样由 ataravati 建议:MVC Custom validation attribute

    【讨论】:

      【解决方案3】:

      这是一个扩展方法,您可以编写该方法将所有模型状态错误分组为一个 Dictionary 集合,现在您可以使用它的键删除一个项目。

      public static IEnumerable Errors(this ModelStateDictionary modelState)
      {
          if (!modelState.IsValid)
          {
              return modelState.ToDictionary(kvp => kvp.Key,
                  kvp => kvp.Value.Errors
                                  .Select(e => e.ErrorMessage).ToArray())
                                  .Where(m => m.Value.Count() > 0);
          }
          return null;
      }
      

      您可以通过var errors = ModelState.Errors();访问模型状态错误集合

      【讨论】:

        【解决方案4】:

        你可以试试:

        public ActionResult Create([Bind(Exclude="ExtraInfo")]UserViewModel userinfo)
        {
        ...
        }
        

        希望会有所帮助。

        【讨论】:

        • 这将从绑定中排除ExtraInfo,而不仅仅是验证。
        • 嗯。是的,我错过了..那么唯一的选择就是覆盖我认为的 OnModelCreating 方法。
        猜你喜欢
        • 2012-05-03
        • 2011-08-23
        • 2021-06-17
        • 1970-01-01
        • 2020-05-17
        • 2021-07-01
        • 2020-05-22
        • 1970-01-01
        相关资源
        最近更新 更多