2011-02-09 5 views
5

私は参照URLを表す私のコントローラの1つのアクション内に文字列を持っています。現在のリクエストのルートデータは、私が探しているものではありません(別のビュー内のスクリプトタグから呼び出されているため)。RouteTable MVC.Netでルートを手動でルックアップするにはどうすればよいですか?

参照URLのアクションとコントローラを検索したいと思います。

"/ Product/23"のような文字列を手動で使用して、コントローラとアクションを見つける方法はありますか?

答えて

8

私は数週間前、この正確なことをやっについてブログ:

Creating a RouteData instance from a URL

+0

ありがとうございます。彼らはキーのように見えるあなたは具体的な実装HttpRequestBaseを作成する必要があります。これで、URIとアプリケーションパスがRouteに変わります。 – ctrlShiftBryan

+0

@ctrlと@Scott - このコードはほとんどの場合*動作しますが、そうでない場合があります。カスタムルート制約は、あらゆる種類の狂ったことをすることを選ぶことができます。ルートテーブルを再スキャンしようとすると、狂ったことがうまくいかないことがあります。ルーティングの一部は、ASP.NET要求パイプラインの非常に早い段階でしか実行されず、一度だけ実行されることを意図しています。私はあなたがそれをしてはならないと言っているわけではありませんが、私はそれがうまくいかない場合があることを警告しています。 – Eilon

+0

素晴らしい記事と私はここであなたのメソッドをスタックオーバーフローで使用するつもりです。しかし、私はバグ '_pathInfo = uri.Query;' - ['PathInfo'](http://msdn.microsoft.com/en-us/library/system.web.httprequest.pathinfo(v = vs .110).aspx)は、[URLの拡張子と '?'クエリ文字列](http://www.nathanaeljones.com/blog/2008/pathinfo-woes)デリミタの間にあるものと思われます。 'http://test.com/page.aspx/path/info?query = 1'は' PathInfo =/path/info'になります。 'PathInfo'でクエリを実行すると、ルートが私に一致しなくなりました。 –

4

あなただけの私が仕事にこれを得たMVC方式を使用したい場合。

  Uri returnUri = new Uri(returnUrl, UriKind.RelativeOrAbsolute); 
      if (!returnUri.IsAbsoluteUri) 
      { 
       returnUri = new Uri("http://localhost" + returnUrl); // localhost used just to get absolute URL 
      } 
      HttpContextWrapper httpContext = new HttpContextWrapper(
       new HttpContext(new HttpRequest(String.Empty, returnUri.AbsoluteUri, String.Empty), new HttpResponse(TextWriter.Null)) 
       ); 
      RouteData routeData = RouteTable.Routes.GetRouteData(httpContext); 
関連する問題