2009-06-11 6 views
0

私のコントローラのアクション:ModelStateとAddModelErrorはコントローラ/アクション内に永続化されていますか?

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Login() 
    { 
     return View(); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Login(string UserName, string Password, bool RememberMe) 
    { 
     var userNameValidationResults = _validatorProvider.Validate<IMailAddressValidator>(UserName); 
     foreach (var result in userNameValidationResults.Where(r => !r.Passed)) { 
      ModelState.AddModelError("UserName", result.ErrorMessage); 
     } 

     var passwordValidationResults = _validatorProvider.Validate<IStringLengthValidator>(Password); 
     foreach (var result in passwordValidationResults.Where(r => !r.Passed)) { 
      ModelState.AddModelError("Password", "Please enter a password."); 
     } 

     if (!ModelState.IsValid) 
      return View(); 

     bool validUser = _userMembershipService.ValidateUser(UserName, Password); 

     if (!validUser) { 
      ModelState.AddModelError("_FORM", "Invalid e-mail address and/or password."); 
      return View(); 
     } 

     _userAuthenicationService.Login(UserName, RememberMe); 

     return RedirectToAction("Index", "Home"); 
    } 

マイビュー:

<h2>Login</h2> 
<%= Html.ValidationSummary() %> 
<% using (Html.BeginForm()) { %> 
    <%= Html.TextBox("UserName") %> 
    <%= Html.Password("Password") %> 
    <%= Html.CheckBox("RememberMe") %> 
    <input type="submit" value="Login" /> 
<% } %> 

私は、検証エラーが発生した後、再びフォームを送信した場合、私はValidationSummaryに別のエラー(同じ正確なエラー)を取得します。なぜそれが起こっているのですか?ありがとう。私は何を意味

編集は、私はnが応募の数であるエラーのn個を持っているということです。

編集2 現在、私は問題が残っているように見えますが、フォームフィールドの値は変更されません。上記のコードを更新しました。また、私はCastle WindsorをIoCコンテナに使用していますが、それが私の問題の原因になるとは思いません。しかし、それが可能な場合は、ここでコントローラを登録するために使用しているソースがあります。

 container.Register(
      AllTypes 
       .FromAssemblyNamed("Aplication") 
       .BasedOn<IController>() 
       .Where(t => t.Name.EndsWith("Controller")) 
       .Configure(c => c.LifeStyle.Is(LifestyleType.Transient)) 
       .WithService 
       .FirstInterface() 
      ); 
+0

あなたはその質問を説明できますか? 「フォームを提出する」ことは何を意味しますか?おそらく、まずModelStateでエラーをクリアする必要があります。 –

+0

バリデータが2回目に再度エラーを生成していないことを確認していますか? ModelStateとエラーは呼び出し間で保持されません。 フォームのHTMLコードを投稿できますか? –

+0

私はループ制御のチェックに 'break; 'をつけているので、そうしてはいけません。 –

答えて

2

実際、私の城ウィンザーの設定でした。

私はその奇妙なことと同時にwhere節を行うことはできません。

0

ここで永続化されるのは、userName、password、およびrememberMeの値だけです。フォームが送信されると、userName、passwordおよびrememberMeが自動的にModelStateに追加されます。 Html.TextBox()は、ModelStateから値を取得し、HTMLに挿入します。

たとえば、不適切なuserNameを送信した場合、コントローラはModelStateエラーを追加します。フォームが再びレンダリングされますが、userNameがすでに古い値で埋められていることがわかります。再度送信すると、明らかに同じエラーが発生します。

+0

私は知っているが、すべてを同じに保っているようだ。 –

関連する問題