2017-07-07 6 views
0

MVCでよく見られるように、私はView、Model、Controllerを持っています。アップデート受信するModelState.IsValidは常にtrueです

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; } 
} 

とコントローラ:

@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> 
} 

モデルは次のようになります。

ビューでは、フォームが含まれてい

[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

答えて

1

私は、電子メールの検証のためにこれを使用します。

@using using System.ComponentModel.DataAnnotations; 

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

このStackOverflow post

を参照してください。ただし、EmailAddressAttributeは その上に、サーバー側の検証を追加します。私。 DataTypeAttributeのみを使用する場合、サーバー側の検証はありません。

+0

[EmailAddress]は欠落していたコンポーネントで、この問題を解決しました。ありがとう。 – Tom

0

間違ったメールアドレスでの問題は、ここでの解決策だ場合:

[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

関連する問題