从modelstate验证中删除对象

时间:2014-06-09 23:15:45

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

我有两种模式:

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

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

4 个答案:

答案 0 :(得分:3)

ModelState中删除错误不是一个好主意。如果您不希望在使用UserInfoExtra时验证UserViewModel类,则应以不同方式定义视图模型(如下所示),然后在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

答案 1 :(得分:1)

  1. 忽略其他属性(UserInfo除外): ModelState.IsValidField(UserInfo)
  2. 清除/删除属性错误: ModelState [“ExtraInfo”]。Errors.Clear();
  3. 创建自定义验证程序, ataravati 建议:MVC Custom validation attribute

答案 2 :(得分:0)

这是一个扩展方法,您可以编写将所有模型状态错误分组为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();

访问modelstate错误集合

答案 3 :(得分:0)

您可以尝试:

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

希望会有所帮助。