2010-12-10 19 views
1

私は既定のWebサイトを提供するASP.NET MVC2 Webアプリケーションを使用して新しいMVC2プロジェクトを作成しました。ホームコントローラーとインデックスビューがあるシンプルな領域を追加しました。コンパイラの最初の問題は、 "コントローラ名 'Home'と一致する複数の型が見つかりました"。ホームをメインに変更してコンパイルしました。UrlReferrerを使用してエリア内の呼び出しページに戻る

新しいタブを追加して自分のエリアのインデックスビューを参照し、ウェブサイトを開いてタブをクリックし始めました。私はエリアのインデックスページを訪問したときは、次のように、私は、バックホームやページについてのメニューを変更せずに行くことができませんでした:

<ul id="menu">    
    <li><%= Html.ActionLink("SampleArea.Main", "Index", "Main", new { area = "SampleArea" }, null)%></li> 
    <li><%= Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)%></li> 
    <li><%= Html.ActionLink("About", "About", "Home", new { area = "" }, null)%></li> 
</ul> 

I可能性を正しくタブを循環。私は、ユーザーがログオフした場合、呼び出し元のページに戻りますUrlReferrer.AbsolutePathを使用しています

public ActionResult LogOff() 
{ 
    FormsService.SignOut(); 

    //return RedirectToAction("Index", "Home"); 
    return RedirectToAction(Request.UrlReferrer.AbsolutePath.ToString()); 
} 

次のように私はその後、アカウントコントローラでログオフビューでコードを変更しました。呼び出しページがSampleAreaで表示される場合、.AbsolutePathには "/ SampleArea"が含まれます。これはコントローラとビューがデフォルトであるため、含まれていないためです。続行すると、次のエラーメッセージが表示されます。

リソースが見つかりません。
説明:HTTP(またはその の依存関係の1つ)が削除された可能性があります。 の名前が変更されたか、 が一時的に利用できません。 をご覧になり、 のスペルが正しいことを確認してください。

要求されたURL:/アカウント/ SampleArea

私の理解では、ログオフが実行されたとき、それはしていたコントローラであるため、/アカウントが追加されたことです。それは/ SampleAreaがアクションであると考え、現在のコントローラを追加してルートを完成させます。

UrlReferrer.AbsolutePathを使用して、エリアとしてSampleAreaを指定する方法はありますか、または正しいページに戻るために他に何かできますか?

新しい追加
これは私が思ったよりも、見知らぬ人です。私は現在開発中のWebサイトを開き、AbsolutePathを使用して戻るためにLogOutビューでreturn文を変更しました。ブレークポイントには、 "/ Club/PrivacyPolicy"が含まれていることがわかります。地球上で、それはむしろ、表示している/ログインを前に付けなければならないのはなぜ/ログイン/クラブ/個人情報保護方針

要求されたURL:しかし、私は以下の違いと同じエラーメッセージが表示されますコントローラである/ Accountよりも?実際には、なぜ何か接頭辞を付けるべきですか?/Club/PrivacyPolicy は、Global.asax.csの有効なルートです。

+1

これはあなたの質問に直接答えませんが、私はいくつかのプロキシサーバーとファイアウォールがセキュリティ対策としてレスポンスから取り除くので、UrlReferrerに慎重に頼っています。 – JasonS

+0

なぜですか?確かに値はシステムによって設定されているので、悪意のある注射の提案はないはずですか? – xiecs

+0

リファラーは、ファイアウォール、アンチウィルス、プロキシなどで切り捨てられることが多いので、このデータにコードロジックを頼るべきではありません。 – zerkms

答えて

0

LogOnまたはLogOutリクエストをトリガーしたときのページに戻る方法を最終的に考え出しました。私は次のコードを使用しました。

Html.ActionLink("Member LogOn", "LogOn", "Account", new { area = "", returnUrl = HttpContext.Current.Request.RawUrl }, null) 

これは、例えば

<a href='/LogIn/LogOn?returnUrl=%2FContactUs'>Member LogOn</a> 

を生成します。私HttpPostのActionResult [ログオンで

、私はその後、

if (!String.IsNullOrEmpty(returnUrl)) 
{ 
    return Redirect(returnUrl); 
} 
    else 
{ 
    return RedirectToAction("Index", "Home"); 
} 

を持って時々私は私がちょうどHttpContext.Request.RawUrlを必要と見つけます。

/Account/LogOnの代わりに/ LogIn/LogOnが生成された理由はわかりませんが、期待どおりに動作します。

+0

私は、/ Account/LogOnの代わりに/ LogIn/LogOnを持っていた理由を発見しました。 LogInからLogOnにView名を変更しましたが、Global.aspxのルーティング定義は変更しませんでした。私がそれらを変更すると、それは/ Account/LogOnになりました。 – xiecs

+0

上記のコードは、Open Redirection攻撃につながる可能性があります。 MVC3では、 "if(!String.IsNullOrEmpty(returnUrl))"を "if(Url.IsLocalUrl(returnUrl))"としてコーディングする必要があります。これはJon Gallowayの最新のブログのおかげです。 – xiecs