2012-01-20 24 views
8

2つのコントローラがあるHomeControllerOtherControllerの空のASP.NET MVC 3アプリケーションを作成しました。なぜHtml.Actionに定義されたルートが必要ですか?

HomeController.cs次のようになります。

@Html.Action("Index", "Other") 

そして、もちろん、Othercontroller.cs:これまでのところ

public class OtherController : Controller 
{ 
    [ChildActionOnly] 
    public ActionResult Index() 
    { 
     return Content("OK!"); 
    } 
} 

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Index.cshtmlは次のようになります、 とても良い。

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 
    } 

とNOルートがOtherControllerと一致しないように、私は、それをくしゃくしゃ:私はGlobal.asax.csからデフォルトRegisterRoutesを取る、私はアプリを実行し、それはすべてが今OK!

である私に語りました:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute("Default", "", new { controller = "Home", action = "Index" }); 
    } 

さて、私はページを実行すると、それはこのエラーメッセージでクラッシュ:

System.InvalidOperationException: No route in the route table matches the supplied values. 
Source Error: 
Line 1: @Html.Action("Index", "Other") 

.Actionへの呼び出しでコントローラ名とアクション名を指定しました。 URLは生成されておらず、要求も行われていません。 ルーティングが関与する必要があるのはなぜですか?

答えて

4

私はこのブログの記事は、あなたがもう少し理解するのに役立ちますことを考える:

http://blogs.charteris.com/blogs/gopalk/archive/2009/01/20/how-does-asp-net-mvc-work.aspx

ルーティングは、リクエストを処理するコントローラを「起動」し、送信したパラメータに基づいて起動する適切なアクションを決定することに本質的に関係し、MVCRouteHandlerはそれらを使用して決定を行います。アクションのどのコントローラーが魔法のようにルーティングテーブルを無視しないかをコントローラに指示し、バックエンドで発生する他のすべてのMVCの優位性を回避します。これらの@HTML.Actionメソッドは、ルーティングテーブルのどのルートを使用するか(たとえばURL構造を考える)に影響を与える可能性のある過負荷を奪う可能性があることを覚えておいてください。

MVCパスは静的コンテンツではないため、ルーティングテーブルを使用して何を行うかを決定するURLRoutingModuleによって解析する必要があります。一致するルートがないため、エラーが発生します。

EDIT私の非難は、私は実際にあなたの最後の文に対応していませんでした。あなたは正しいですが、URLは生成されませんでしたが、アプリケーションへのリクエストが生成されました。 HTML。アクションはルーティングを使用して、使用するコントローラ、アクション、領域、パラメータを決定します。私はそれがActionLinkを生成してあなたのためにそれをクリックするようなものであるという簡単な言葉で言うことは公正だと思います。

+0

感謝君は。どの経路を使用するかに影響を与える過負荷の特定の例を挙げると役立ちます。あなたは単純なものを考えることができますか? –

+1

ここの自宅(ヤム、ワイン)の遅い時間に、最初に気になるのはあなたのルート値辞書のエリアを使用することでしょう。ルートハンドラがなければ、MVCはコントローラを探すネームスペースをどのように知るか、それがアクションのパラメータであったかどうかを知ることができます。 - > @ Html.Action( "Action"、 "Controller"、new {area = "Admin"})。また、名前付きルートは、ルートの名前を渡すだけで、名前付きルート定義で定義できるので、コントローラ、アクションパラメータを渡す必要はありません。 – Tommy

0

コントローラでHtml.Actionを使用するとルーティングが行われました。エンジンが "Index"のアクションを持つ "Other" HtmlHelperを見つけられなかった場合、ルーティングを通過することを意味するそのパスの実行がデフォルトになりました。経路が一致していないため、エラーが発生しました。

InvalidOperationException The required virtual path data cannot be found.

http://msdn.microsoft.com/en-us/library/ee721266.aspx

0

次のように私のためのソリューションだった:

私は私にエラーを与えていた次の行を持っていた:thridパラメータを追加する

@{Html.RenderAction("ActionName", "ControllerName");} 

はエラーを解決:

@{Html.RenderAction("ActionName", "ControllerName", new { area = string.Empty });} 
関連する問題