自定义ValidationAttribute不显示错误
Custom ValidationAttribute not displaying error
我写了一个自定义ValidationAttribute来检查Email是否已经存在于Db中。但是没有显示错误消息,并且在提交表单之后才进行验证。HTML包含对javascript文件的引用,以显示此消息,但仍然没有结果。然而,其他属性工作正常,并显示各自的消息。
public class NoDuplicateEmail : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var context = new MhotivoContext();
var email = validationContext.ObjectInstance.GetType().GetProperties(
).FirstOrDefault(prop => IsDefined(prop, typeof(NoDuplicateEmail)));
var emailValue = (string)email.GetValue(validationContext.ObjectInstance);
if(context.Users.FirstOrDefault(x => x.Email == emailValue)!=null)
return new ValidationResult("Email is in use!");
return ValidationResult.Success;
}
}
<代码>代码>
[Required(ErrorMessage = "Email is required")]
[DataType(DataType.EmailAddress)]
[Display(Name = "Email")]
[NoDuplicateEmail]
var email
方法的IsValid
参数包含您的电子邮件属性的值,因此您的var emailValue
和[Remote]
行代码是不必要的。你的代码应该是
public class NoDuplicateEmail : ValidationAttribute
{
private const string _DefaultErrorMessage = "Email {0} is in use!"
public NoDuplicateEmail() : : base(_DefaultErrorMessage)
{
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var context = new MhotivoContext();
if (value != null)
{
var email = (string)value;
if(context.Users.FirstOrDefault(x => x.Email == emailValue) != null)
{
return new ValidationResult(FormatErrorMessage(email));
}
}
return ValidationResult.Success;
}
}
然而,你不应该在验证属性中访问数据库资源(这不是它的责任,你的代码不可能进行单元测试)。您应该使用ActionResult
属性进行客户端验证,并调用服务进行服务器端验证。
创建一个服务方法,返回一个值来指示它的有效性(或者在你的控制器中添加一个私有方法
)private bool isEmailInUse(string email)
{
return context.Users.Any(x => x.Email == email)
}
和RemoteAttribute
用于客户端验证
public JsonResult IsUniqueEmail(string email) // the parameter name must match the property name
{
bool isInUse = isEmailInUse(email);
return Json(!isInUse, JsonRequestBehavior);
}
然后应用CC_8属性
[Remote("IsUniqueEmail", yourControllerName, ErrorMessage = "The email is already in use")]
public string Email { get; set; }
最后,在POST方法中(以防恶意用户,或者javascript已被禁用)
public ActionResult YourMethod (YourModel model)
{
if (isEmailInUse(model.Email)
{
// add a ModelState error and return the view
}
}
或者在保存时捕获异常(假设数据库字段有唯一约束)
相关文章:
- jquery表单验证复选框错误显示
- 为什么Inspect元素中的错误显示函数myNUM()没有定义?如何定义函数
- 禁用文本框的脚本错误显示
- 为什么错误显示为函数体之前缺少{
- Firefox SDK:包括jquery.flot在内的问题,错误显示维度高度为空
- 版边上出现错误“显示临时标题”
- 自定义错误显示在自定义位置,而不是每个元素旁边
- JavaScript错误显示在浏览器中
- jQuery tonum 是刨丝器,然后如果错误显示错误,则从没有
- 根据发现的错误显示不同的引导程序警报消息
- Javascript代码错误显示未定义的值
- 将输入字段值传入angularjs $resource undefined,错误显示未知的作用域提供商
- JavaScript错误显示在Joomla1.5页面
- 使用ruby生成节点并使用javascript错误显示它们
- d3js:条形图是不可见的,没有错误显示
- 与一些javascript,密码/用户名错误显示
- JavaScript错误显示表
- Javascript(与相位器)错误显示游戏的颜色-括号
- Jquery表单验证错误显示Div
- Php错误显示,而访问输入类型=文件使用jquery/ajax方法