2012-01-20 56 views
8

我創建了一個空的ASP.NET MVC 3應用程序,帶有2個控制器,HomeControllerOtherController爲什麼你需要一個爲Html.Action定義的路由?

HomeController.cs看起來是這樣的:

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

Index.cshtml看起來是這樣的:

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

,當然,Othercontroller.cs:

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

到目前爲止, 太好了。我運行應用程序,它告訴我一切都OK!

現在,我把默認RegisterRoutes從Global.asax.cs中:

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 
     ); 
    } 

我揉碎了起來,所以沒有路由匹配OtherController

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

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

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

現在,當我運行的頁面,它與此錯誤消息崩潰

我在.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進行分析。既然你沒有匹配的路線 - 你會得到一個錯誤。

編輯

在我的謾罵,我並沒有真正解決您的最後陳述。你是對的,沒有生成URL,但生成了對應用程序的請求。 HTML。Action仍將使用路由來確定要使用的控制器,操作,區域和參數。我認爲用簡單的術語來說這很公平,就像生成一個ActionLink併爲你點擊它一樣。

+0

謝謝您。這可能有助於給出一個會影響使用哪條路線的重載示例。你能想到一個簡單的嗎? –

+1

在這裏,在家裏的最後時刻(yum,wine),首先想到的就是在你的路線價值字典中使用一個區域。沒有路由處理程序,MVC如何知道要查找控制器的哪個名稱空間,或者它是否是操作的參數。 - > @ Html.Action(「Action」,「Controller」,new {area =「Admin」})。另外,命名路由可能是另一個例子,您只需傳遞路由的名稱,並且不一定需要傳遞控制器的操作參數,因爲它們可以在命名的路由定義中定義。 – Tommy

0

路由通過在控制器上使用Html.Action而受到影響。當引擎找不到「索引」動作的「其他」HtmlHelper時,默認執行該路徑,這意味着要通過路由。沒有路由匹配,所以它拋出了一個錯誤。

InvalidOperationException The required virtual path data cannot be found.

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

0

對我來說,溶液如下:

我有以下行這是給我的錯誤:

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

添加THRID參數解決了這個錯誤:

@{Html.RenderAction("ActionName", "ControllerName", new { area = string.Empty });} 
相關問題