2011-09-13 21 views
5

ASP.net MVC3のコンテキストでは、特定のURLにリダイレクトしようとするコントローラアクションにこのコード行があります。リダイレクト(URL)が機能しない

returnUrlは "/ Home/Index /"を含む文字列です。何らかの理由でリダイレクトが行われず、同じ画面に残ります。私は後続のスラッシュを削除しようとしましたが、成功しませんでした。リダイレクトが行われない理由は何ですか?

答えて

13

Redirectの方法は、サイトの外部URLにリダイレクトし、絶対URLを渡すことを目的としています。あなたのサイトに属している別のコントローラのアクションにリダイレクトする必要がある場合には、これを使用する方が良いでしょう:

return RedirectToAction("Index", "Home"); 

あなたはもはやURLをハードコーディングし、コードされている。この方法では、ルート変更に壊れにくくなります。

これは、AJAXでこのリダイレクトを実行するコントローラアクションを呼び出す場合、ブラウザをどこにでもリダイレクトすることは期待できないことです。>明らかに同じページにとどまることになります。 AJAXリクエストはすべてのリダイレクトに続いて成功し、成功コールバックではAJAXなしでリクエストされたかのように/Home/Index URLの最終HTMLを取得します。

あなたはあなたがにリダイレクトするターゲットURLを示す例えば、あなたのコントローラのアクションの戻りJSONオブジェクトを持つことができます呼び出すAJAXの成功コールバックにリダイレクトしたい場合:

return Json(new { redirectToUrl = Url.Action("Index", "Home") }); 

とコールバックでwindow.location.href機能を使用します。

success: function(result) { 
    window.location.href = result.redirectToUrl; 
} 
+0

まずは、徹底的な返信をいただきありがとうございます。私はここでAJAXを使用していないので、あなたの返信の第2部分を除外することができます。理想的には私はRedirectToAction()を使用したいと思いますが、ここでは元々リクエストされたページとしてreturnUrlを取得しています。この元のリクエストは、アプリケーションの任意のページにすることができます。だから私はコントローラとアクションをRedirectToAction()でハードコードすることはできません。文字列操作技術を使ってreturnUrlからControllerとActionパートを取り出すオプションが1つあります(それでも非常に難しいでしょう)。より良い解決策。 – Jatin

+0

@Nirvan、returnUrl文字列変数を送信する代わりに、コントローラーとアクションである2つの変数を送信します。このようにして、必要なURLを作成することができます。もしそうでなければ、 'http:// yoursite.com/home/index'のようなリダイレクトで絶対URLを使ってみてください。 –

+0

@Darain、申し訳ありませんが、認証に関することはあまりよく分かりませんでした。デフォルトでasp.net認証は、ログイン前に最初に要求されたページを追跡します。私は自分自身でreturnUrlを設定しません。たとえば、ユーザーがログインする前に/ Home/Indexにアクセスしようとすると仮定します.ASP.net認証は、ログインしてアプリケーションのログインページにリダイレクトします。これは、サーバーがreturnUrlに "/ Home/Index"として入力する場所です。だから私は最初に要求されたページのURLを含むログインコントローラ内の文字列(regurnUrl)だけを取得することがわかります。 – Jatin

2

あなたは、有効なログオン資格情報を供給した後、同じログイン画面上で立ち往生している場合、あなたがフォーム認証Cookieを設定していない可能です。

あなたはログインactionmethodsにリダイレクトまたはRedirectToLocalを使用するたびに、あなたは次の順序で呼び出していることを確認してください。

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
return RedirectToLocal(returnUrl); 

これは確実には、クッキーは、リダイレクトの前に設定されているそれ以外のクライアントは、ユーザーかのように扱いますログインしていません。

ありがとうございました

関連する問題