我正在使用MVC5并尝试验证表单。
当我在字段上插入无效的电子邮件地址时,会显示错误消息
如果我插入@a(这是一个有效的电子邮件地址),前端验证通过,但在后端,我的ModelState在电子邮件字段上显示错误,告诉它无效。
如果我插入a@a.com,两个验证方都会通过!
注意:其他SO答案的很大一部分与&#34;电子邮件验证无关于MVC&#34;,解决方案是使用我已经使用的EmailAddress属性。< / em>的
查看
@using (Ajax.BeginForm("EnviarMensagemContato", "home", new AjaxOptions { HttpMethod = "POST", OnBegin = "showLoading", OnComplete = "showJsonModalMessage" }, new { @id = "contact-form" }))
{
@Html.AntiForgeryToken()
<div class="col-md-6 lateral-division">
<div class="form-group">
@Html.TextBoxFor(m => m.ContatoViewModel.Nome, new { @class = "form-control required", placeholder = "nome" })
@Html.ValidationMessageFor(m => m.ContatoViewModel.Nome)
</div>
<div class="form-group">
@Html.TextBoxFor(m => m.ContatoViewModel.EmailAddress, new { @class = "form-control required", placeholder = "email" })
@Html.ValidationMessageFor(m => m.ContatoViewModel.EmailAddress)
</div>
<div class="form-group">
@Html.TextAreaFor(m => m.ContatoViewModel.Mensagem, 4, 4, new { @class = "form-control required", placeholder = "mensagem" })
@Html.ValidationMessageFor(m => m.ContatoViewModel.Mensagem)
</div>
</div>
<div class="btn-group pull-right btn-send-message">
<input type="submit" value="enviar" id="enviar-mensagem" class="btn btn-default" />
</div>
}
模型
public class ContatoViewModel
{
[Required(ErrorMessage="campo obrigatório"),
Display(Name = "nome")]
public String Nome { get; set; }
[Required(ErrorMessage = "campo obrigatório"),
Display(Name = "nome"), MaxLength(254,ErrorMessage="email inválido"),
EmailAddress(ErrorMessage="email inválido")]
public String EmailAddress { get; set; }
[Required(ErrorMessage = "campo obrigatório"),
Display(Name = "nome"), MaxLength(500, ErrorMessage = "maximo de 500 caracteres")]
public String Mensagem { get; set; }
}
控制器
public JsonResult EnviarMensagemContato(ModelContainer model)
{
try
{
if (ModelState.IsValid)
{
//zalgo
}
}
}
答案 0 :(得分:2)
我认为您在ASP.NET MVC项目中使用了默认的 jQuery Validation 库。如果是这种情况,问题在于,用于验证电子邮件的正则表达式在 jQuery Validation 库和EmailAddressAttribute
中是不同的,属性更严格。我的建议是覆盖 jQuery Validation 电子邮件方法,如下所示:
$.validator.methods.email = function (value, element) {
return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/.test(value);
}
正则表达式直接来自EmailAddressAttribute源代码here。如果您希望允许没有TLD的电子邮件(例如user @ localhost),您可以按照in this answer所述编写自己的属性,并将正则表达式放在 jQuery Validation 库中。这样,您将拥有相同的验证结果客户端和服务器端。
答案 1 :(得分:1)
[Required(ErrorMessage = "The Email address is required")]
[RegularExpression(RegularExpression.RegexEmail, ErrorMessage = "Invalid Email address")]
public string Email { get; set; }
在RegularExpression.cs文件中包含
/// <summary>
/// Regular expression for email
/// </summary>
public const string RegexEmail = @"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}";
答案 2 :(得分:0)
我不认为@ a是有效的电子邮件地址,或者如果是,我不认为该属性会将其考虑在内。
测试了这个,如果我输入@ a,我得到客户端验证错误。如果我输入a@a.a
,我就不会这样做如果您需要此类电子邮件有效,您可以使用自己的正则表达式。
答案 3 :(得分:0)
如果您需要细粒度控制并且在您面前透明代码,我建议您不要依赖HTML帮助程序来绘制控件并在客户端和服务器端执行验证。
我会使用以下常规exp作为mvc模型属性。
[Required]
[RegularExpression(BusinessRules.Email,ErrorMessage = Messages.EmailNotValid)]
public string LoginEmail { get; set; }
BusinessRules.Email在哪里
public const string Email = "^[\\w!#$%&'*+\\-/=?\\^_`{|}~]+(\\.[\\w!#$%&'*+\\-/=?\\^_`{|}~]+)*@((([\\-\\w]+\\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\\.){3}[0-9]{1,3}))$";
在客户端验证时,您只能确保电子邮件不是空的。最后,客户端验证不如服务器端验证那么重要,因为它很容易被欺骗。
答案 4 :(得分:0)
优良作法是一次一个地表示数据注释,如下面的代码,这也可能有助于您的错误。
[Required(ErrorMessage="campo obrigatório")]
[Display(Name = "nome")]
public String Nome { get; set; }
答案 5 :(得分:0)
有两个独立的控制点。如果您使用正确的比较一次,则不必再次检查该值以供以后使用。然后,使用正则表达式将解决问题。