2009-10-20 21 views
5

Global.asaxで定義したルートを使用して、相対URLのコントローラ名を取得するにはどうすればよいですか?私はこのようなルートdefiend持っている場合ASP.NET-MVC。どのようにURLからコントローラの名前を取得するには?

例は、文字列 "〜/ EN /製品/リスト" から

routes.MapRoute(
       "Default",            // Route name 
       "{language}/{controller}/{action}/{id}",     // URL with parameters 
       new { controller = "Home", action = "Index", id = "", language = "en" } 

を私は製品(コントローラ名)を持っていると思います。すでにこれを行っている既存の方法はありますか?

+1

どこに配置されますか? –

+0

UrlHelperを拡張するヘルパークラスで – Gregoire

+0

https://stackoverflow.com/questions/8830052/how-do-i-get-the-controller-and-action-names-from-the-referrer-uri –

答えて

4

参照スティーブンヴァルターのブログ投稿をASP.NET MVC Tip #13 – Unit Test Your Custom Routes

プロジェクトMvcFakesには、古いSystem.Web.Abstractionsリファレンスがあります。したがって、新しいものと を置き換え、MvcFakes.dllを取得するプロジェクトをrecomplyする必要があります。

これは私のコードです: "MvcApplication" 上記の私のコードで

public string getControllerNameFromUrl() 
{ 
    RouteCollection rc = new RouteCollection(); 
    MvcApplication.RegisterRoutes(rc); 
    System.Web.Routing.RouteData rd = new RouteData(); 
    var context = new FakeHttpContext("\\" + HttpContext.Request.Url.AbsolutePath); 
    rd = rc.GetRouteData(context); 
    return rd.Values["action"].ToString(); 
} 

は、Global.asaxの中のクラス名です。

幸運を祈る!

+0

ありがとう、私は試してみます。 – Gregoire

+0

上記のStephen Waltherのブログのリンクは、まだ動作します。しかし、自分のサイトでは、ダウンロードリンクが失敗し、ヒント#12へのリンクも失敗するため、 'FakeHttpContext'クラスのリストを取得できません。あなたは他の場所を知っていて、同様の機能を得ることができますか? – Zarepheth

+0

ヒント#12はこちらです:http://stephenwalther.com/archive/2008/07/01/asp-net-mvc-tip-12-faking-the-controller-context – VeeTheSecond

1

私はあなたが何を求めているのか分からないので、私の答えが間違っていれば、あなたが望むものを推測しているからです。

Global.asaxにはいつでも別のルートを追加できます。それはしばしば、「規範外」のケースに対処する最も簡単な方法です。

あなたが製品のリストを返したい場合、あなたはこのルートを使用します:

routes.MapRoute(
      "ProductList",   
      "{language}/{products}/{action}/", 
      new { controller = "Products", action = "List", language = "en" }); 

エンティティの複数のタイプがこれを使用しようとしている場合は、より汎用的な{controller}で製品を置き換えることができますルート。必要に応じて変更する必要があります。

は、たとえば、これは、任意の製品のリストを取得するために使用できることを、一般的なルートを作るために:

routes.MapRoute(
      "ProductList",   
      "{language}/{controller}/{action}/", 
      new { controller = "Products", action = "List", language = "en" }); 

これが何をするか、それはあなたが常にあなたのDefaultの前に置く必要があること(ルートを作成することです「ユーザーが何を入力したとしても、彼らが要求するコントローラーとアクションを私に与えてください」と言う)。 (例えば、/en/Products/List、または/en/Users/Listなど)。

コントローラを訪問するには、yoursite.com/en/products/listに移動するだけです。 HTMLActionLinkを使用してコントローラにアクセスすることもできます。

<%=Html.ActionLink("Product", "List", new { controller = Products }, null) %>

私は私のIDEオープンせずにこれを書いているので、ActionLinkはそれでエラーを有することができます。

+1

ありがとう私の答えは時間がかかっていますが、私が探しているのは逆のGetRoute関数です(現在のものではなく)URLからコントローラ名を抽出できるようにしたいです – Gregoire

+0

@Gregoire素晴らしい、なぜあなたは最初にそのことを言っていないのですか? –

+0

申し訳ありませんが、私はそれが十分であると信じていたので間違いをしました – Gregoire

6

あなたが本当にちょうどあなたがあなたのコントローラのアクションメソッドでこれを行うことができ、ルートから派生コントローラの値が必要な場合は、おそらくジョージが示唆のように別のルートを追加しますが、必要があります。

var controller = (string)RouteData.Values["controller"]; 
+1

RouteDataではなく、任意のURLからcontrllerの名前を取得する方法はありますか? – Gregoire

+0

@Gregoire?あなたのサイトや他の誰かの任意のURLを意味しますか?あなたのサイトでは、彼はあなたにどのように言った。 –

+1

いいえ、私は間違いをしないでください(現在のHTTPコンテキストで動作します) – Gregoire

関連する問題