我想用内置的验证尽可能功能。 我也想用同样的模型CRUD方法。
然而,作为一个下拉列表中不能使用标准的模式来完成,我必须手动验证。 在后背法,我想只是验证下拉列表,这个结果添加到ModelState中,这样我就不必验证所有与数据注解来实现其他参数。 是否有可能实现这一目标?
我可能是弄错了下拉列表中,但是从我读,一个下拉列表中HTML对象的名称不能相同,在模型中的属性,以便正确设置选择的值。 是否仍然可以使用数据标注与此解决方法吗?
谢谢。
我想用内置的验证尽可能功能。 我也想用同样的模型CRUD方法。
然而,作为一个下拉列表中不能使用标准的模式来完成,我必须手动验证。 在后背法,我想只是验证下拉列表,这个结果添加到ModelState中,这样我就不必验证所有与数据注解来实现其他参数。 是否有可能实现这一目标?
我可能是弄错了下拉列表中,但是从我读,一个下拉列表中HTML对象的名称不能相同,在模型中的属性,以便正确设置选择的值。 是否仍然可以使用数据标注与此解决方法吗?
谢谢。
您可以使用addModelError
ModelState.AddModelError(key,message)
当您使用,它将无效的ModelState这样isValid
将返回false。
更新
看到注释@彼得的回答后,
如果你想从影响排除元素isValid()
结果,你可以使用ModelState.Remove(field)
之前调用方法isValid()
另一种选择是继承IValidatableObject
在你的模型。 实现它的Validate
方法,你可以留在原地其他所有验证和写你在这个方法想要的任何代码。 注意:您返回一个空IEnumerable<ValidationResult>
表示没有任何错误。
public class Class1 : IValidatableObject
{
public int val1 { get; set; }
public int val2 { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var errors = new List<ValidationResult>();
if (val1 < 0)
{
errors.Add(new ValidationResult("val1 can't be negative", new List<string> { "val2" }));
}
if (val2 < 0)
{
errors.Add(new ValidationResult("val2 can't be negative", new List<string> { "val2" }));
}
return errors;
}
}
编辑:在重新阅读的问题后,我不认为这适用于这种情况,但我离开这里的答案的情况下,它可以帮助别人。
你不能手动设置ModelState.IsValid财产,但你可以到ModelState中,这将确保该IsValid的是假的添加消息。
ModelState.AddModelError();
是的,你可以做到这一点(也将用于CRUD方法同型号):
示例模型
public class User
{
public virtual int Id{ get; set; }
public virtual Role Role { get; set; }
}
public class Role
{
[Required(ErrorMessage = "Id Required.")]
public virtual int Id { get; set; }
[Required(ErrorMessage = "Name Required.")]
public virtual string Name { get; set; }
}
实施例视图,在下拉列表的验证
@Html.DropDownListFor(m => m.Role.Id, (SelectList)ViewBag.gRoles, "-- Select --")
@Html.ValidationMessageFor(m => m.Role.Id)
控制器:清除所需的(但这里并不需要)领域
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Creedit(User x)
{
x.Role = db.RoseSet.Find(x.Role.Id);
if (x.Role != null)
{
ModelState["Role.Name"].Errors.Clear();
}
if (ModelState.IsValid)
{
// proceed
}
else
{
// return validation error
}
}