Jac*_*ack 7 c# validation asp.net-4.0 data-annotations asp.net-mvc-2
我有一个自定义数据验证属性我创建,以确保用户输入的密码是相同的,但从不调用IsValid.
自定义属性:
public class IsSameAsAttribute : ValidationAttribute
{
public String TargetProperty { get; set; }
private readonly object _typeId = new object();
public IsSameAsAttribute(string targetProperty)
{
TargetProperty = targetProperty;
}
public override bool IsValid(object value)
{
return false;
//Type objectType = value.GetType();
//bool isValid = false;
//PropertyInfo[] neededProperties =
// objectType.GetProperties().Where(propertyInfo => propertyInfo.Name == TargetProperty).ToArray();
//return isValid;
}
public override object TypeId
{
get { return _typeId; }
}
}
Run Code Online (Sandbox Code Playgroud)
它适用的数据模型:
public class RegistrationData
{
[Required(ErrorMessage = "First Name Required")]
[StringLength(100, ErrorMessage = "First Name must be 100 characters or less.")]
public String FirstName { get; set;}
[Required(ErrorMessage = "Last Name Required")]
[StringLength(100, ErrorMessage = "Last Name must be 100 characters or less.")]
public String LastName { get; set; }
[Required(ErrorMessage = "Email is Required")]
[StringLength(200, ErrorMessage = "Email must be 200 characters or less.")]
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "Valid Email Address is required.")]
public String Email { get; set; }
[Required(ErrorMessage = "Password is required")]
public String Password { get; set; }
[IsSameAs("Password")]
public String PasswordRepeat { get; set; }
[Required(ErrorMessage = "Division is required")]
public String Division { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
控制器从哪里调用:
[HttpPost]
public ActionResult ValidationDemo(RegistrationData model)
{
if (ModelState.IsValid)
{
return Redirect("/");
}
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
所有"开箱即用"验证都能正常运行,这只是我的自定义验证没有被调用.在进行调试时,我发现它是在调用构造函数时实例化的,但是在IsValid上设置的断点永远不会被命中.
发生了什么,我该如何解决?
UPDATE
好吧,我摆弄了一些,如果我在我的控制器中调用TryUpdateModel(模型),它最终会调用IsValid.所以这对我来说意味着我的自定义属性没有被"注册"任何运行MVC 2中的验证.有没有办法解决这个问题?
[HttpPost]
public ActionResult ValidationDemo(RegistrationData model)
{
TryValidateModel(model); // <--- *** Added this line and it "works"
if (ModelState.IsValid)
{
return Redirect("/");
}
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
您是否尝试过填写所有其他字段以满足所有开箱即用的验证,并查看是否触发了您的自定义验证?如果客户端验证不满足,表单将被阻止回发,因此您的服务器端自定义验证将不会被触发,
要使自定义验证属性在客户端起作用,必须进行一些额外的工作。
在这里阅读 Phil 关于验证的优秀文章: http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx
| 归档时间: |
|
| 查看次数: |
4266 次 |
| 最近记录: |