2010-12-21 9 views
1

助けてください、私はこの問題に苛立ちました。return jsonresultはjqueryポストで無期限に動作します

ユーザーが送信ボタンを押したときにエラー値を設定するか、リダイレクトを行う必要があります。 (標準的なログインフォーム)。私はajaxでそれを行う必要があります。

私はそのほとんど働いて、ユーザーがクリックを提出するが、ページがちょうど表示さだと思う:「ユーザー名か:{:「/ホーム/インデックス」「リダイレクト」}

または {「エラー」 が指定されたパスワードが間違っています。」}

私はそれをどのように意図しているのかのエラーをリダイレクト/表示していません。 。

いくつかの背景 - フォームがログインフォームであり、そのモーダルポップアップダイアログの内部に配置され(jqueryui)

HERESに私のjQuery:

$("#submit").click(function() { 
      $.post({ 
       url: "Account/LogOn", 
       dataType: "json", 
       success: function (data) { 
        if (data.redirect) { 
         // data.redirect contains the string URL to redirect to 
         window.location.href = data.redirect; 
        } 
        else { 
         // data.form contains the HTML for the replacement form 
         $("#error").replaceWith(data.error); 
        } 
       } 
      }); 
      return false; 
     }); 

とHERESに私の対処法:

[HttpPost] 
    public JsonResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
       if (Url.IsLocalUrl(returnUrl)) 
       { 
        return Json(new { redirect = returnUrl }); 
       } 
       else 
       { 
        return Json(new { redirect = "/Home/Index" }); 
       } 
      } 

     } 
     return Json(new { error = "The user name or password provided is incorrect." }); 
    } 

HERESに私のフォームです:

@using (Html.BeginForm("LogOn", "Account")) 
{ 

    <div> 
     <fieldset> 
      <legend>Account Information</legend> 

      <div class="editor-label"> 
       @Html.LabelFor(m => m.UserName) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.UserName) 
       @Html.ValidationMessageFor(m => m.UserName) 
      </div> 

      <div class="editor-label"> 
       @Html.LabelFor(m => m.Password) 
      </div> 
      <div class="editor-field"> 
       @Html.PasswordFor(m => m.Password) 
       @Html.ValidationMessageFor(m => m.Password) 
      </div> 

      <div class="editor-label"> 
       @Html.CheckBoxFor(m => m.RememberMe) 
       @Html.LabelFor(m => m.RememberMe) 
      </div> 

      <p> 
       <input id="submit" type="submit" value="Log On" /> 
      </p> 
     </fieldset> 
    </div> 
} 
+1

なぜコントローラ「HttpPost」からリダイレクトできないのですか? (例えば、RedirectToActionはPRGパターンも満たす)。なぜあなたはJSONを返す必要があり、次にそれをクライアント側で行う必要がありますか? – RPM1984

+0

おそらく私はリダイレクトを行うことができますが、私はまたajaxによってエラーを表示するケースをカバーする必要があります。ログインフォームがモーダルダイアログ内にあるので、このインスタンスの別のページにリダイレクトすることはできません – raklos

+1

クリック機能が実行されていますか?あなたの説明に関しては、フォームが通常の方法で提出されるように聞こえます。関数の一番下にあるhttp://api.jquery.com/event.preventDefault/を使用してください。 –

答えて

1

まあ、$ .post()呼び出し全体が間違っています。

これを使用します。$アヤックス()に期待されるように

$("#submit").click(function (e) {e.preventDefault(); 
      $.post("Account/LogOn", 
        $(this.form).serialize(), 
        function (data) 
        { 
         if (data.redirect) 
         { 
         // data.redirect contains the string URL to redirect to 
         window.location.href = data.redirect; 
         } 
         else 
         { 
         // data.form contains the HTML for the replacement form 
         $("#error").replaceWith(data.error); 
         } 
        }, 
        'json' 
      ); 
      return false; 
     }); 

あなたは、引数の表記法を使用しましたが、$.post()にそれは違います。

+0

soooたくさんありがとう! – raklos

関連する問題