2012-03-06 1 views
1

問題が発生した場合は、モデル検証エラーで更新したい部分的なビューであるログインウィジェットがあります。それ以外の場合は、ページをリロードする必要があります。asp.net mvcパーシャルビューリダイレクトまたはエラー表示

私は、次の

LogOn.cshtml

@{ 
    var ajaxOpts = new AjaxOptions {OnSuccess = "success"}; 
} 

<div id="login"> 
    @Html.ValidationSummary(excludePropertyErrors: true) 

    <h2>Start by Logging in</h2> 

    @using (Ajax.BeginForm("LogOn", "Account", ajaxOpts)) 
    { 
     @Html.Hidden("returnUrl", Request.Url.PathAndQuery) 

     <table width="100%" border="0" cellspacing="0" cellpadding="5"> 
      <tr> 
       <td> 
        <span class="bluey">Username:</span><br /> 
        @Html.TextBoxFor(m => m.UserName, new {tabindex = "1", Class = "field"}) 
        @Html.ValidationMessageFor(m => m.UserName, "*") 
       </td> 
       <td> 
        <span class="bluey">Password:</span><br /> 
        @Html.TextBoxFor(m => m.Password, new {tabindex = "2", Class = "field"}) 
        @Html.ValidationMessageFor(m => m.Password, "*") 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <input name="login" type="submit" value="Submit" class="input_btn" tabindex="3" /> 
       </td> 
       <td>@Html.CheckBoxFor(m => m.RememberMe) @Html.LabelFor(m => m.RememberMe) <span class="bluey">&nbsp; | &nbsp;</span> @Html.ActionLink("Forgot Password?", "Password", "User")</td> 
      </tr> 
     </table> 
    } 
</div> 

<script> 
    function success(context) { 
     //var returnUrl = context.get_data().returnUrl; 
     //if (returnUrl) { 
     // window.location.href = returnUrl; 
     //} else { 
      $("#login").replaceWith(context); 
     //} 

    } 

</script> 

と呼び出されるアクションは、私は、データが部分的に誤っている場合、それはので、作業をすることを持っている

[HttpPost] 
    public ActionResult LogOn(LogOnModel userDetails, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (Membership.ValidateUser(userDetails.UserName, userDetails.Password)) 
      { 
       FormsAuthentication.SetAuthCookie(userDetails.UserName, userDetails.RememberMe); 

       return Redirect(returnUrl); 
      } 
      ModelState.AddModelError("", "The username or password provided was incorrect"); 
     } 

     return PartialView(userDetails); 
    } 

である必要がありビューはエラーで再表示されますが、この部分は、JavaScriptの他の行を成功(コンテキスト)でコメントアウトすると機能しますユーザーが正常にログインし、ページをリダイレクトする必要があります。

これを行うより良い方法はありますか?

statusプロパティとreturnUrlまたはHtmlを持つJson()で匿名オブジェクトを返そうとしましたが、PartialView(userDetails)によって生成されたhtmlをJsonに取得する方法を理解できませんでした)コール、とにかく物事について行くのは間違った方法かもしれないようです。

答えて

1

AJAXコールではリダイレクトできません。あなたはリダイレクトするURLを指しているサーバーからJSONオブジェクトを返し、成功コールバックで実際のリダイレクトを実行できます。

成功の場合は、あなたのコントローラのアクションで今すぐ
function success(result) { 
    if (result.returnUrl) { 
     // the controller action returned JSON 
     window.location.href = returnUrl; 
    } else { 
     // the controller action returned a partial 
     $('#login').html(result); 
    } 
} 

は、単純にリダイレクトするのではなく、戻りURLを返す:

return Json(new { returnUrl = returnUrl }); 

すでにビューに戻りURLを持っているように見えるところで:Request.Url.PathAndQuery。私はそれがサーバに戻って戻ってくるのが分かりません。成功を示すJSONブール値を返すだけで、URLへの成功コールバックでリダイレクトを実行できます。

+0

ステータスコードがサポートされているように見えるので、jquery.ajaxを使用しても問題ないのですか? –

+0

@DanielPowell、それはまさにunobtrusibve-ajaxがカバーで使用するものです - > jquery.ajax。だから完全に同等です。もちろん、それはjquery.ajaxやAJAX呼び出し、つまり最も基本的なXmlHttpRequestオブジェクトの組み込みブラウザでさえも動作しません。サーバーでリダイレクトすると、クライアントは最終的な宛先に到達するまで自動的にリダイレクトを実行します。最終宛先に到達すると、ステータスコードは200になります。 –

関連する問題