2009-06-11 20 views
0

我的控制器操作:ModelState和AddModelError在Controller/Action中是否持久?

[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中清除錯誤。 – 2009-06-11 16:33:45

+0

你確定你的驗證器第二次沒有再次產生錯誤嗎? 模型狀態和錯誤不會在調用之間持續存在。 你能發佈表單html代碼嗎? – 2009-06-11 17:05:21

回答

2

其實,這是我的城堡溫莎配置。

container.Register(
     AllTypes 
      .FromAssemblyNamed("Aplication") 
      .BasedOn<IController>() 
      .Configure(c => c.LifeStyle.Is(LifestyleType.Transient)) 
      .WithService 
      .FirstInterface() 
     ); 

它的怪異我不能同時基於和where子句做。

0

這裏唯一持久的是userName,password和rememberMe值。提交表單時,userName,password和rememberMe會自動添加到ModelState中。 Html.TextBox()然後從ModelState中獲取值並將其插入到HTML中。

例如,如果您提交了錯誤的userName,則控制器會添加一個ModelState錯誤。表單再次呈現,但您會看到userName已經填充了舊值。如果你再次提交,你會明顯再次得到相同的錯誤。