我有两种模式:
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
验证?
答案 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)
答案 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();
答案 3 :(得分:0)
您可以尝试:
public ActionResult Create([Bind(Exclude="ExtraInfo")]UserViewModel userinfo)
{
...
}
希望会有所帮助。