2011-08-03 9 views
1

私は次のように指定されたデフォルトルートのみでMVCアプリケーションを持っている:すべての理解と経路の構成

routes.MapRoute(_ 
      "Default", _ 
      "{controller}/{action}/{id}", _ 
      New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _ 
      ) 

まず、私は中の単語「デフォルト」の意味を理解したいと思いますこのルートの最初のパラメータは、私が意図した通りに動作するルートを構築するためです。以下では

は、私は他のコントローラのために行うずっと同じように、特にURLでインデックス方法に言及することなく、ApplicationModuleコントローラのインデックスを呼び出すことが可能になりたかった:

href="<%= ResolveUrl("~/") %>ApplicationModule/Index/<%= Html.Encode(app.id) %>" 

場合このURLから/ Indexを削除すると、アプリケーションはそのリソースが見つからないことを通知します。 私は何が間違っていますか?

答えて

1

デフォルトはルートの名前です。

これを行うルートを設定できますが、残りのサイトが壊れる可能性があります。

問題は、URLの2番目のパラメータをIDとして自動的に処理することですが、アクションメソッド名ではなくIDであることをどのようにして知るのでしょうか?

+0

例えば:次のURLは、それを指定せずに記事コントローラのindexメソッドを呼び出す - のhref = "<%= ResolveUrl(" 〜/ ")%>記事"。 IDに起因する問題ですか? – Hallaghan

+0

はい、idをアクション名として扱っています。 –

+0

最終的に私は、私のURLに厳密に指定されたインデックスに固執する必要があります、そうですか? – Hallaghan

0

Answer:1 "Default"は内部参照用のルートの名前に過ぎず、ルートが何であるかを説明するのに役立ちます。

回答2:このマッピングをデフォルト値の前に追加してください。

routes.MapRoute(_ 
    "ApplicationModuleIndex", _ 
    "ApplicationModule/{id}", _ 
    New With {.controller = "ApplicationModule", .action = "Index", .id = UrlParameter.Optional} _ 
) 

これは、URL「ApplicationModule /アクション」(すなわちなしidは)だけではなく、indexアクションを呼び出すことが副作用を有することができ、あなたは

の(前の前の)追加のルートが必要な場合があります
routes.MapRoute(_ 
       "ApplicationModule", _ 
       "ApplicationModule/{action}", _ 
       New With {.controller = "ApplicationModule", .action = "Index"} _ 
       New With {.action = "Index|Action1|Action2"} _ 
    ) 

代わりに、あなただけのこれらの新しいルートを追加するダンプしHandleUnknownAction

をオーバーライドすることができ

有効なアクションの|区切りリストで"Index|Action1|Action2"を交換してください

たとえば、ルーティングメカニズムを理解するあなたのApplicationModuleコントローラ

protected override void HandleUnknownAction(string actionName) { 
    var result = Index(actionName); 
    result.ExecuteResult(ControllerContext); 
} 
+0

ユーザーが 'ApplicationModule/1234'に移動した場合、2つのアクションの違いをどのように伝えますか? –

+0

私はルーティングを誤解したことがありますか?最初のルーティングが失敗したときに移動しませんか? –

+0

私はそれがパターンに一致する最初のルートを使用すると思います。 URLが実際に有効かどうかをチェックするようには見えません。 –

1

は練習と経験が必要です。ルーティングメカニズムの背後にあるアイデアは、着信URLを取得し、要求を処理するハンドラ(IHttpHandler)オブジェクトを取得することです。あなたの質問については、MapRoute拡張メソッドの最初のパラメータはルートの名前です。あなたはMVCプロジェクトを設定すると、あなたが得る:

routes.MapRoute(_ 
    ' "Default" is your route name. It can be null, "" or some other name that you give it 
    "Default", _  

    ' This is your URL with parameters 
    "{controller}/{action}/{id}", _ 

    ' Parameter defaults 
    new { .controller = "Home", .action = "Index", .id = UrlParameter.Optional }) 

路線名paremeterは、あなただけの名前を使用してコントローラとアクションを呼び出すことができます。たとえば、代わりの:

routes.MapRoute(_ 
    "YourRouteName", _ 
    "ApplicationModule/{id}", _ 
    New With {.controller = "ApplicationModule", .action = "Index", .id = UrlParemeter.Optional }) 

そして、これを置く:

return RedirectToAction("ActionName", "ControllerName", new { paramId = 1234 }); 

あなたはそれがこのようなものであるべきルートの設定については

return RedirectToRoute("MyRouteName", new { paramId = 1234 }); 

のようにルート名を使用することができますプロジェクトを作成するときにMVCがあなたに与える既定値より新しい新しいルート設定。そうしないと、新しいルート設定は捕捉されず、デフォルトの設定は常に着信URを解決しようとしますL 's。

、代わりに使用しての最後に1つの以上の提​​案、このような

href="<%= ResolveUrl("~/") %>ApplicationModule/Index/<%= Html.Encode(app.id) %>" 

使用Url.Content:

href="<%= Url.Content("Index", "ApplicationModule", With New { .id = app.id })" 

は、これは自動的に仮想パスを解決し、ビットすっきり見えるでしょう。 Steven SandersonのPro ASP.NET MVC 2 Frameworkを入手する機会があれば、URLとルーティングの仕組みについてははっきりとわかります。

敬具、

Huske

+0

私のような新人でさえ理解できる優れた説明です。ヒント+1 – Hallaghan

関連する問題