2012-01-16 11 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場合であっても、 !=空のビューには、これらの変数の空のフィールドが表示されます(しかし、デバッガには値が表示されます)。なぜそれを正しくするのか?また、あなたがその認証に成功し、クッキー、発光時に心に留め

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

+0

上記のコメントは「//これまでに何か失敗しました、再表示フォーム」ですが、model.returnUrlの後で処理を停止するものは何もありませんので、上記のコードに基づいてコメントが正しくありません –

+0

何も分かりません... – John

答えて

0

はあなたにModelStateから自分の行動に変更するか、HTMLヘルパーでそれらを使用する場合、古い値が使用される値をクリアしてみビュー(あなたの場合は部分的)を表示すべきではありません。クライアントが後続の要求で認証Cookieを送信するようにリダイレクトする必要があります。あなたはリターンURLにリダイレクトする必要があります。しかし、AJAXを使ってこれをやっているので、クライアントにリダイレクトできるように、認証が成功したという指示をクライアントに送るべきでしょう。

+0

それは本当に私を助けましたが、なぜ私は理解できません。モデル値は、両方のケースで同じです。明確なモデル状態の場合とない場合です。なぜ、どのようにビューが値を更新する必要があるかを知っていますか? – John

+0

@ジョン、これは、TextBoxFor、HiddenForなどのHtmlヘルパーのためです。最初にmodelstateを値をバインドするときと、その後でモデルで調べます。これは設計によるものです。したがって、後で表示されるhtmlヘルパーで元の値の代わりに変更された値を使用する場合は、すでに投稿されていてモデルステートの一部である値を変更する場合は、モデルステートから削除する必要があります。 POSTリクエストの一部。 –

関連する問題