ASP MVC上ViewModel字段的条件验证
本文关键字:条件 验证 字段 ViewModel MVC ASP | 更新日期: 2023-09-27 18:06:08
标题:ASP MVC中ViewModel字段的条件验证
我有一个关于ASP MVC验证的问题。假设我有如下视图模型
public class PersonViewModel
{
[Required]
public string Name {get; set; }
[Required]
public string Email {get; set; }
}
根据这个,当我提交表单MVC将验证这两个字段都有值。但是,在我的网站中,我遇到了可以在全局站点设置中关闭Email的情况,因此模型将只呈现表单上的Name Textbox。现在,当我提交表单时,它仍然要求我输入Email字段,因为它被指示为"Required",尽管用户现在无法填充该字段。
在使用ASP MVC验证时,这种类型的场景有解决方案吗?
我似乎找到了解决办法:
if(EmailTurnedOff)
{
this.ViewData.ModelState.Remove("Email");
}
然后当我调用ModelState。它会给出正确的答案
解决方案是,如果设置了这样的设置,您必须在Email
字段上取下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);
}
可以从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;
}
不要忘记在View的正确位置添加ValidationMessage:
@Html.ValidationMessage("EmailErrorMsg")
编码快乐!
借助groovejet,这就是我如何在控制器中使用条件[Required]而不是视图模型。我这样做是因为在我的应用程序中只有一个操作我想忽略[Required]。
public ActionResult Update(MyViewModel mVM)
{
if(mVM.Role == "Role" && mVM.Property == null)
{
ModelState.Remove("Property");
}
if (ModelState.IsValid)
{
// code...
}
}