ModelState.IsValid始终为真
与MVC中的典型情况一样,我有一个View,一个Model和一个Controller。ModelState.IsValid始终为真
视图包含的一种形式:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.HiddenFor(m => m.Id)
<ul class="fieldlist">
<li>
@Html.LabelFor(m =>m.Email)
@Html.TextBoxFor(m => m.Email)
@Html.ValidationMessageFor(m => m.Email)
</li>
<li>
<div class="row">
<div class="col-md-6">
@Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName)
@Html.ValidationMessageFor(m => m.FirstName)
</div>
<div class="col-md-6">
@Html.LabelFor(m => m.LastName)
@Html.TextBoxFor(m => m.LastName)
@Html.ValidationMessageFor(m => m.LastName)
</div>
</div>
</li>
<li>
@Html.LabelFor(m => m.PhoneNumber)
@Html.TextBoxFor(m => m.PhoneNumber)
@Html.ValidationMessageFor(m => m.PhoneNumber)
</li>
<li>
<div Class="row">
<div Class="col-md-2">
<input type="submit" value="Save" />
</div>
</div>
</li>
</ul>
}
这个模型看起来是这样的:
public class UserAdminUserViewModel
{
[Display(Name = "User Database ID"), DataType(DataType.Text)]
public string Id { get; set; }
[Display(Name = "Full Name")]
public string Name { get { return FirstName + " " + LastName; } }
[Required()]
[Display(Name = "First Name"), DataType(DataType.Text)]
public string FirstName { get; set; }
[Required()]
[Display(Name = "Last Name"), DataType(DataType.Text)]
public string LastName { get; set; }
[Required()]
[Display(Name = "Email Address"), DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Display(Name = "Telephone Number"), DataType(DataType.Text)]
public string PhoneNumber { get; set; }
}
而控制器接收更新:
[HttpPost,ValidateAntiForgeryToken]
public ActionResult User(UserAdminUserViewModel model)
{
if (ModelState.IsValid)
{
// do something, apply the updates to the database, presumably
}
return View(model);
}
...但ModelState中.IsValid是总是为真。控制器是接收输入的信息,但似乎没有进行验证。我曾尝试:
TryUpdateModel<UserAdminUserViewModel>(model);
和
UpdateModel<UserAdminUserViewModel>(model);
我不知道我怎么看这些的工作,但他们是我碰到的第一个建议。没有骰子。无论“模型”中的数据如何,仍然有效。我也试过:
System.ComponentModel.DataAnnotations.Validator.ValidateObject(model, new System.ComponentModel.DataAnnotations.ValidationContext(model));
更有希望,但仍然无法正常工作。我也尝试了更详细的方法:
System.ComponentModel.DataAnnotations.ValidationContext valContext = new System.ComponentModel.DataAnnotations.ValidationContext(model, null, null);
List<System.ComponentModel.DataAnnotations.ValidationResult> valResults = new List<System.ComponentModel.DataAnnotations.ValidationResult>();
System.ComponentModel.DataAnnotations.Validator.TryValidateObject(model, valContext, valResults, true);
foreach(System.ComponentModel.DataAnnotations.ValidationResult result in valResults)
{
this.ModelState.AddModelError(result.MemberNames.FirstOrDefault() ?? string.Empty, result.ErrorMessage);
}
......这也没有工作。 'valResults',应该包含模型状态中的任何错误,永远不会被填充;没有验证发生。
我会用这个电子邮件验证:
@using using System.ComponentModel.DataAnnotations;
[Required]
[EmailAddress]
[Display(Name = "Email Address")]
public string Email { get; set; }
然而,EmailAddressAttribute上的 此之上增加了服务器端验证。即如果您仅使用 DataTypeAttribute,则不存在服务器端验证!
[EmailAddress]是缺少的组件,添加这个解决了这个问题。谢谢。 – Tom
如果使用不正确的电子邮件地址的问题,这里的解决方案:
[Email(ErrorMessage = "Invalid Email Address")]
[Required()]
[Display(Name = "Email Address"), DataType(DataType.EmailAddress)]
public string Email { get; set; }
DataType(DataType.EmailAddress)
仅仅意味着如何显示在客户端的文本框,而Email
属性不实际验证。
将[EmailAddress]添加到电子邮件属性中并没有什么用。 – Tom
你有你的客户端jquery.validate,jquery.unobtrusive和jquery.validate.unobtrusive包括在该范围内的某个地方? –
虽然愚蠢,但你传递错误的数据以及测试吧?! –
我故意输入一个不正确的电子邮件地址,是的。 – Tom