2012-01-16 108 views
0

我想通過ajax更新局部視圖,但它不起作用。看看這個模型類:部分視圖和ajax

public class LogOnModel 
    { 
     [Required] 
     [Display(Name = "User name")] 
     public string UserName { get; set; } 

     [Required] 
     [DataType(DataType.Password)] 
     [Display(Name = "Password")] 
     public string Password { get; set; } 

     [Display(Name = "Remember me?")] 
     public bool RememberMe { get; set; } 

     public bool IsLoggedIn { get; set; } 

     public string ReturnUrl { get; set; } 
    } 

以下幾種觀點:

@model ITW2012Mobile.ViewModels.LogOnModel 
<div id='LogOn' style="background-color: White;"> 
    @using (Ajax.BeginForm("LogOnAjax", "Home", new AjaxOptions { UpdateTargetId = "LogOn", OnSuccess = "logInComplete" })) 
    { 
     ITW2012Mobile.ViewModels.LogOnModel m = Model; 
     @Html.EditorFor(model => model.IsLoggedIn) 
     @Html.EditorFor(model => model.ReturnUrl) 
     <div> 
      @Html.ValidationSummary() 
     </div> 
     <div> 
      @Html.LabelFor(model => model.UserName) 
      @Html.EditorFor(model => model.UserName) 
     </div> 
     <div> 
      @Html.LabelFor(model => model.Password) 
      @Html.EditorFor(model => model.Password) 
     </div> 
     <div> 
      <input type="submit" value="Login" /> 
     </div> 
    } 
</div> 

與下列的控制器類:

public ActionResult LogOnAjax(LogOnModel model) 
{ 
    if (!User.Identity.IsAuthenticated) 
    { 
     if (ModelState.IsValid) 
     { 
      if (Membership.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
       model.IsLoggedIn = true; 
       model.ReturnUrl = Url.Action("Index", "Home"); 
      } 
      else 
      { 
       ModelState.AddModelError("", "The user name or password provided is incorrect."); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return PartialView("PartialViewAjaxLogOn", model); 
    } 
    else 
    { 
     return PartialView("PartialViewLogOut"); 
    } 
} 

即使用戶名/密碼是否正確,IsLoggedIn =真實RETURNURL !=空視圖顯示這些變量的空字段(但調試器顯示內部的值)。爲什麼以及如何使它正確?

+0

注意你上面的評論'//如果我們得到了這麼多,失敗的東西,重新顯示的形式',然而,你沒有什麼可以在model.returnUrl之後停止處理,所以根據你上面的代碼註釋是不正確的 – 2012-01-17 00:24:09

+0

沒有任何理解... – John 2012-01-17 00:33:33

回答

0

嘗試清除您從ModelState中你的行動被修改,或者如果您在HTML輔助使用它們的舊值將被使用的值:

ModelState.Remove("IsLoggedIn"); 
model.IsLoggedIn = true; 
ModelState.Remove("ReturnUrl"); 
model.ReturnUrl = Url.Action("Index", "Home"); 

的同時也要記住的是在成功驗證和cookie的排放您不應該顯示一個視圖(部分在你的情況)。您應該重定向,以便客戶端在隨後的請求中發送身份驗證Cookie。您應該重定向到返回網址。但是,由於您正在使用AJAX進行此操作,因此您應該向客戶端發送一些指示,表明身份驗證已成功,以便您可以在客戶端上重定向。

+0

它真的幫了我,但我不明白爲什麼。對於兩種情況,模型值都是相同的 - 對於具有清晰模型狀態和沒有模型狀態的情況。爲什麼以及如何查看知道需要更新值? – John 2012-01-17 23:43:58

+0

@John,那是因爲Html助手,比如TextBoxFor,HiddenFor,...首先查看模型狀態時綁定它們的值,然後在模型中。這是設計。因此,如果您打算修改已發佈的內容和模型狀態的一部分的值,那麼如果您希望後續視圖中的HTML助手使用修改後的值而不是原來的值,則必須將其從模型狀態中移除POST請求的一部分。 – 2012-01-17 23:46:03