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',应该包含模型状态中的任何错误,永远不会被填充;没有验证发生。

+1

你有你的客户端jquery.validate,jquery.unobtrusive和jquery.validate.unobtrusive包括在该范围内的某个地方? –

+0

虽然愚蠢,但你传递错误的数据以及测试吧?! –

+0

我故意输入一个不正确的电子邮件地址,是的。 – Tom

我会用这个电子邮件验证:

@using using System.ComponentModel.DataAnnotations; 

[Required] 
[EmailAddress] 
[Display(Name = "Email Address")] 
public string Email { get; set; } 

请参阅本* post

然而,EmailAddressAttribute上的 此之上增加了服务器端验证。即如果您仅使用 DataTypeAttribute,则不存在服务器端验证!

+0

[EmailAddress]是缺少的组件,添加这个解决了这个问题。谢谢。 – Tom

如果使用不正确的电子邮件地址的问题,这里的解决方案:

[Email(ErrorMessage = "Invalid Email Address")] 
[Required()] 
[Display(Name = "Email Address"), DataType(DataType.EmailAddress)] 
public string Email { get; set; } 

DataType(DataType.EmailAddress)仅仅意味着如何显示在客户端的文本框,而Email属性不实际验证。

+0

将[EmailAddress]添加到电子邮件属性中并没有什么用。 – Tom