2010-02-22 37 views
13

我想以這種方式來使用Html.RenderAction在ASP.NET MVC 2 RC2「在路由表中的路由提供的值相匹配」:Html.RenderAction導致

在菜單的Controler:

[ChildActionOnly] 
public ActionResult ContentPageMenus() 
{ 
    var menus = _contentPageMenuRepository.GetAll().WithCulture(CurrentCulture); 
    return PartialView(menus); 
} 

而且在我的索引視圖(Home控制器的Index操作):

<% Html.RenderAction("ContentPageMenus", "ContentPageMenu");%> 

但我總是收到此錯誤信息: 在路由表中的路由提供的值相匹配。

回答

0

您是否爲您註冊了其他路線申請?

+1

我發現了這個問題。我總是刪除{controller}/{action}路線並使用小寫REST類似URL來定製我的所有路線。但是對於Html.RenderAction,有必要有這樣的一般路由。我將這條通用路線添加到我的路線列表末尾,並且工作正常。 – 2010-02-22 14:41:32

5

你的控制者的名字是什麼? 默認情況下,以下是您的路線發生的情況。

在您的RenderAction方法中指定的控制器名稱使用追加到該名稱的「Controller」進行搜索。

Controller中的Action方法被調用並返回一個View。

所以,通過看你的代碼,會發生以下情況

  1. 你應該叫「ContentPageMenuController」一個控制器
  2. 你應該叫「ContentPageMenus」你有
  3. 你的行動應該有一個名爲ContentPageMenus()

這是假設你沒有改變默認的路由,並沒有添加新的會影響你的r郊遊

+9

我發現了這個問題。我總是刪除{controller}/{action}路線並使用小寫REST類似URL來定製我的所有路線。但是對於Html.RenderAction,有必要有這樣的一般路線。我將這條通用路線添加到我的路線列表末尾,並且工作正常。 – 2010-02-22 14:42:02

+0

哇!我花了數小時才弄明白爲什麼我有這個問題標題中所述的錯誤信息。這裏的評論幫助我解決了它!謝謝! – Roger 2010-11-15 20:44:55

+1

我使用AttributeRouting項目,如果有辦法消除默認路線但仍然能夠正常使用RenderAction,那將是非常棒的!否則,我偶爾會被輸入錯誤的ActionLink助手燒燬,從而導致基於默認值的錯誤URL,我真的更喜歡異常! – 2012-06-28 17:44:10

0

爲什麼不嘗試使用強類型的方法?

試試這個:

<% Html.RenderAction<ContentPageMenusController>(x => x.ContentPageMenus()); %> 

你必須填寫類的確切名稱。

+0

在ASP.NET MVC 2 RC2中可用嗎?我看不到這個。 – 2010-02-23 13:28:17

+0

是的,這是...我從一個項目中使用它的代碼 – vintem 2010-02-23 17:21:08

+3

看來,這種方法實際上是從MVC期貨:http://forums.asp.net/p/1565646/3901280.aspx – StriplingWarrior 2010-07-20 21:20:58

11

MVC期貨用於允許呈現沒有路線的操作。這在ASP.NET MVC2中發生了變化。

如果你想RenderAction的工作,並希望隱藏你的路線,使其不公開訪問。

  1. globals.asax.cs中添加您的行動路線。
  2. [ChildActionOnly]屬性裝飾你的動作。
4

我有同樣的錯誤。它是由改變默認路線引起的;顯然它明確搜索路由名稱「默認」。

7

添加像這樣的第三個參數是我的解決方案(以剃刀):

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

+0

Memet - 你能請讓我知道這個解決方案是否正常,它不會影響任何其他地方? - 這確實解決了我的問題 – 2016-06-18 18:48:26

0

我以前曾經有過這個問題,這是在此路由不包括控制器。

​​

我還是希望能夠調用一個動作後直區,所以我增加了以下路線,像這樣。

  context.MapRoute(
      "Route_default", 
      "Search/{action}/{id}", 
     new { controller = "Search", action = "Index", id = UrlParameter.Optional } 
     ); 

     context.MapRoute(
      "Route_Controller", 
      "Stuff/{controller}/{action}/{id}", 
      new { controller = "Something", action = "Index", id = UrlParameter.Optional } 
     );