【发布时间】:2014-11-10 06:18:52
【问题描述】:
想象一下User 类。此类提供数据库中使用的唯一属性。
public class User
{
public string Login { get; set; }
public string Password { get; set; }
public DateTime ActiveDateStart { get; set; }
public DateTime ActiveDateEnd { get; set; }
}
并使用验证器查看 User 类的模型
public class UserViewModel: User, IValidatableObject
{
[Required(ErrorMessage = "Enter login")]
[RegularExpression("[a-zA-Z][a-zA-Z0-9]*", ErrorMessage = "Only alpha and digits")]
new public string Login { get; set; }
[Required(ErrorMessage = "Enter password")]
new public string Password { get; set; }
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (ActiveDateStart > ActiveDateEnd)
{
yield return new ValidationResult("Active period start must be before perion end date", new[] { "ActiveDateStart" });
}
}
}
查看
<div class="form-group">
@Html.LabelFor(m => m.Login })
@Html.TextBoxFor(m => m.Login })
@Html.ValidationMessageFor(m => m.Login)
</div>
<div class="form-group">
@Html.LabelFor(m => m.Password })
@Html.PasswordFor(m => m.Password })
@Html.ValidationMessageFor(m => m.Password)
</div>
<div class="form-group">
@Html.LabelFor(m => m.ActiveDateStart })
@Html.TextBoxFor(m => m.ActiveDateStart })
@Html.ValidationMessageFor(m => m.ActiveDateStart)
</div>
<div class="form-group">
@Html.LabelFor(m => m.ActiveDateEnd })
@Html.TextBoxFor(m => m.ActiveDateEnd })
@Html.ValidationMessageFor(m => m.ActiveDateEnd)
</div>
@Html.ValidationSummary()
控制器
[HttpPost]
public ActionResult Create(UserViewModel model)
{
if (ModelState.IsValid)
{
// do something
}
return View(model);
}
问题
通过属性指定的所有验证均已成功执行,所有错误均已成功显示在视图中。但是通过IValidatableObject进行的验证不起作用,也没有显示错误。
【问题讨论】:
-
更具体地说明您的问题
-
首先,我建议不要创建基本属性
new,因为这实际上是在复制属性。将基类属性设为虚拟,并在 ViewModel 中覆盖它们。此外,您的控制器中似乎有错字。它不应该接受UserViewModel的论点,而不是UserModel吗?调试的时候,如果在Validate方法上设置了断点,是不是碰到了断点? -
@xDaevax 我在实体框架中使用这个类,据我所知,添加虚拟修饰符会使这个属性对 EF 不可见
-
@xDaevax 运行期间不使用 Validate 方法。断点没有受到干扰。
标签: c# asp.net-mvc validation ivalidatableobject