サイトに到着したときにユーザーのブラウザー/バージョンをチェックするフィルターを使用しています。サポートされていないブラウザを使用している場合は、アクセスしようとしていた URL を「RequestedURL」という ViewData に保存し、ブラウザが古いことを示すビューにリダイレクトします。このビューにより、ユーザーはリンクをクリックして先に進むことができます。このリンクの URL は、フィルターで設定された「RequestedUrl」の ViewData 属性によって取り込まれています。
フィルター:
/// <summary>
/// If the user has a browser we don't support, this will present them with a page that tells them they have an old browser. This check is done only when they first visit the site. A cookie also prevents unnecessary future checks, so this won't slow the app down.
/// </summary>
public class WarnAboutUnsupportedBrowserAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
//this will be true when it's their first visit to the site (will happen again if they clear cookies)
if (request.UrlReferrer == null && request.Cookies["browserChecked"] == null)
{
//give old IE users a warning the first time
if ((request.Browser.Browser.Trim().ToUpperInvariant().Equals("IE") && request.Browser.MajorVersion <= 7) ||
(request.Browser.Browser.Trim().ToUpperInvariant().Equals("Chrome") && request.Browser.MajorVersion <= 22) ||
(request.Browser.Browser.Trim().ToUpperInvariant().Equals("Mozilla") && request.Browser.MajorVersion <= 16) ||
(request.Browser.Browser.Trim().ToUpperInvariant().Equals("Safari") && request.Browser.MajorVersion <= 4))
{
filterContext.Controller.ViewData["RequestedUrl"] = request.Url.ToString();
filterContext.Result = new ViewResult { ViewName = "UnsupportedBrowserWarning" };
}
filterContext.HttpContext.Response.AppendCookie(new HttpCookie("browserChecked", "true"));
}
}
}
ViewData へのビュー参照:
<a href="@ViewData["RequestedUrl"] ">Thanks for letting me know.</a>
ほとんどの URL は正常に機能します。問題は、ユーザーがパラメーターを含む URL を入力したときに発生します。例えば:
[WarnAboutUnsupportedBrowser]
public ActionResult Index(string providerkey)
ユーザーが入力した URL が「../Controller/Foo/providerkey」の場合、ビューに入力される URL は「Controller/Foo」であり、ページにアクセスするために必要なパラメーターが欠落しています。
ビュー内の URL が、ユーザーが最初に入力した URL 全体であることを確認するにはどうすればよいですか?