2010-12-20 17 views
9

新しいユーザーを作成するコントローラを実装しました。ユーザーが正常に作成されると、Index()にリダイレクトされます。私が欲しいもの成功のリダイレクトと失敗時のエラー表示

は、すべてがOKであるときをリダイレクトされますが、現在のページで滞在し、何かが失敗したときにエラーを参照してください。

jQuery ajaxMVCを使用しています。

私のコントローラは次のようになります。jQueryを使って傍受して、コールがAJAXで作られているフォーム送信

[Authorize] 
public ActionResult CreateUser(string username) 
{ 
    try 
    { 
     //here the logic to create the user 
    } 
    catch (Exception ex) 
    { 
     string error = string.Format("Error creating user: {0}", ex.Message); 
     Response.StatusCode = 500; 
     Response.Write(error);  
    } 
    return RedirectToAction("Index"); 
} 

$("#new-user-form").submit(function() { 
    var form = $(this); 
    $.ajax({ 
    type: "GET", 
     url: form.attr('action'), 
     data: form.serialize(), 
     success: function(data, textStatus, xhr) { 
      //At this point I would like to redirect 
     }, 
     error: function(xhr, textStatus, errorThrown) { 
      $(".error-summary").html(xhr.responseText); 
     } 
    }); 

    //cancel the event 
    return false; 
}); 

エラーが発生したときにそれが正常に動作しますが、成功事例の実装方法はわかりません。

他の方法があります。

+0

私も同様の状況です。私は記入するフォームを含むページを持っています。ページ上のボタンは1つのフィールドからデータを取り出し、関連するデータを検索するためのWebサービスを呼び出し、検索が成功した場合は別のページにリダイレクトします。検証済みのフィールドはボタンのルックアップ操作には適用できないため、Ajaxを使用してデータ検証をバイパスします。ルックアップに失敗した場合は、同じページにエラーを表示する必要があります。少なくともそれが私にしてほしいことです。 – Suncat2000

答えて

29

あなたはAJAXを使用している理由を成功アクションにリダイレクトしようとしている場合は? AJAXの目的は、ページ全体をリロードせずにサイトの一部だけをリフレッシュすることです。あなたがAJAXから得るすべての目的と利点を完全に打ち負かすリダイレクトに成功するアクションであれば。あなたがここにあなたが何ができるかだ尋ねたので、しかし:

[Authorize] 
public ActionResult CreateUser(string username) 
{ 
    ... 
    if (Request.IsAjaxRequest()) 
    { 
     return Json(new { redirectToUrl = Url.Action("Index") }); 
    } 
    return RedirectToAction("Index"); 
} 

をそして:

success: function(data, textStatus, xhr) { 
    window.location.href = data.redirectToUrl; 
}, 
+0

@ダリン:私が解決策を理解しているかどうかは分かりませんが、その仕組みを正確に説明できますか?ありがとう! –

+1

@Danielのコントローラアクションでは、このリクエストがAJAXリクエスト( 'Request.IsAjaxRequest')であったかどうかをチェックし、そうであれば' {redirectToUrl = '/ home/index'} 'のようなJSONオブジェクトを返します。 jQueryはJSONを理解していて、それを見ると自動的に解析し、 'success'コールバックに渡される' data'パラメータに渡します。ですから、成功コールバックでは、 '/ home/index'に等しい' data.redirectToUrl'へのアクセス権があり、 'window.location.href'関数を使ってブラウザをこのURLにリダイレクトします。しかし私が私の記事で説明したように、これはまったく役に立たない。 –

+0

@ダーリン:何かが失敗したら、私はページにとどまる必要があります。これが私がAJAXを使用している理由です。これを行うための他の良い方法はありますか? –

0
window.location.href="url here" 

Moz Doc

+1

@Daniel:あなたが行きたいURL - ダーリンはこの問題を 'Url.Action(" Index ")で解決しているようです - 成功したいところですか? – Hogan

1

をここでは純粋なMVCクラスを使用して、任意のスクリプトをハードまたはjQueryのを使用する必要はありません代替答えがあります。最初に、MVC 2のバリデーターは、成功、失敗、および確認のために問題なく動作することがわかりました。

1)必要なMVCスクリプトを含めます(3つの合計プラスEnableClientSideValidation呼び出し - MSDNを参照)。

2)モデル/データエンティティにMetadataClassAttributeとRequiredAttribtuesを挿入します。別のメタデータクラスを作成してモデルを部分的にする必要はありません(そのパンツは、同じモデルクラスを属性内で参照するだけです)。

3))は、既に提案されているようJavaScriptを返すことによって、問題をリダイレクトする(しかし、jQueryの指向の方法でAJAXを解く...

それは既ににリストページからリダイレクトに失敗したとき、私は唯一の検証中に奇妙な行動を負いました詳細/編集ページ。エラーメッセージは数秒間表示され、消えます!もちろん、ページのシェルが最初のリストページであり、編集ページの内部コンテンツだったので、混乱しました。したがって、問題の根本原因は、デフォルトのMVC 2ツールキットが最初のページから正しくリダイレ​​クトできず、2番目のページで正しく動作していないことではありませんでした。

私はここで同じ解決策を見つけた:

http://craftycodeblog.com/2010/05/15/asp-net-mvc-ajax-redirect/ ...私はVBで拡張メソッドやクラスに拡大しています。NET:

''' <summary> 
    ''' MVC extension methods. 
    ''' </summary> 
    Public Module MvcExtensions 

     ''' <summary> 
     ''' Returns an <see cref="AjaxAwareRedirectResult"/> for the specified action 
     ''' and optional controller name. 
     ''' </summary> 
     <Extension()> _ 
     Public Function AjaxAwareRedirectToAction(controller As Controller, _ 
             actionName As String, _ 
             Optional controllerName As String = Nothing) _ 
            As RedirectResult 

      ' Get target URL 
      Dim url = controller.Url.Action(actionName, controllerName) 

      ' Return AJAX aware redirect result 
      Return New AjaxAwareRedirectResult(url) 

     End Function 

    End Module 

    ''' <summary> 
    ''' <see cref="RedirectResult"/> which works with MVC 2 AJAX. 
    ''' </summary> 
    ''' <remarks> 
    ''' Normal redirects do not work with AJAX partial updates in MVC (HTTP 302 status). 
    ''' With MVC 2 AJAX it is necessary to return JavaScript to change the browser location. 
    ''' </remarks> 
    Public Class AjaxAwareRedirectResult 
     Inherits RedirectResult 

     ''' <summary> 
     ''' Creates an instance which redirects to the specified URL using 
     ''' a response containing either AJAX JavaScript or classic HTTPS 302 status. 
     ''' </summary> 
     ''' <param name="url">Target URL.</param> 
     Sub New(url As String) 
      MyBase.New(url) 
     End Sub 

     ''' <summary> 
     ''' Generates the response. 
     ''' </summary> 
     Public Overrides Sub ExecuteResult(ByVal context As ControllerContext) 

      ' Check if AJAX was used for request 
      If context.RequestContext.HttpContext.Request.IsAjaxRequest Then 

       ' Perform JavaScript redirect when AJAX is used 
       Dim destinationUrl As String = UrlHelper.GenerateContentUrl(Url, context.HttpContext) 
       Dim result As JavaScriptResult = New JavaScriptResult With { 
         .Script = ("window.location='" + destinationUrl + "';")} 
       result.ExecuteResult(context) 

      Else 

       ' Perform classic HTTP 302 status redirect 
       MyBase.ExecuteResult(context) 

      End If 

     End Sub 

    End Class 

次に、2つのオプションがあります。 MVCターゲットのAjaxAwareRedirectToAction(aciton、[controller])を呼び出す典型的なMVCパターンに従うか、特定のURLターゲット(つまり外部サイト)を念頭に置いたときにAjaxAwareRedirectResult(url)の新しいインスタンスを返すことができます。

Microsoftが最初のMVC 2 RTMで並べ替えたAJAXリダイレクトを取得しなかったのは本当に驚いていました。私は現在のプロジェクトでMVC 2を使用しなければなりません。なぜなら、この制限に苦しんでいるだけでなく、新しいMVCソリューションをいくつか持っていて、検証のためにjQueryにもっと傾いているからです。私は彼らがそれを修正するとすぐにわかります。

1

成功のアクションでリダイレクトする場合は、なぜAJAXを使用していますか? AJAXの目的は、ページ全体をリロードせずにサイトの一部だけをリフレッシュすることです。あなたは、AJAXを呼び出すたびCheckAuthorizationクラスは、あなただけ入れていることを行った後

public class CheckAuthorization : AuthorizeAttribute 
{ 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (HttpContext.Current.Session["AFSUserId"] == null || !HttpContext.Current.Request.IsAuthenticated) 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       filterContext.HttpContext.Response.StatusCode = 302; //Found Redirection to another page. Here- login page. Check Layout ajaxError() script. 
       filterContext.HttpContext.Response.End(); 
      } 
      else 
      { 
       filterContext.Result = new RedirectResult(System.Web.Security.FormsAuthentication.LoginUrl + "?ReturnUrl=" + 
       filterContext.HttpContext.Server.UrlEncode(filterContext.HttpContext.Request.RawUrl)); 
     } 
    } 
} 

:その内の任意のエラーまたはセッションは、あなたがクラスブリューを作るので、フィルターAuthorizeAttributeをオーバーライドする必要がデフォルトのログインpage.Forをリダイレクトしようとしている有効期限が切れた場合以下のような認証:

[CheckAuthorization] 
public class BuyerController : Controller 
{ 
    [HttpGet()] 
    public ActionResult GetOrderlist() 
    { 
     return View(); 
    } 
} 

は今、あなたは、コードの各Ajaxの呼び出し ので入れライン上に表示側にAJAXのステータス302を処理する必要があなたのレイアウトページ順にleadid DESCによるいかなる特定のページので、以下のように:

ここ

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { 
     if (jqXHR.status == 302) { 
      window.location.href = '@Url.Action("Login", "Home")'; 
     } 
    }); 
あなたは、現在のセッションの有効期限が切れるか、タイムアウト場合はログインページにリダイレクトされています。

関連する問題