2016-05-31 62 views
0

我們開始爲我們的MVC項目使用路由,所以我們基本上用RouteLink()替換ActionLink() - 現在我們要替換RenderAction()來添加我們需要的路由信息​​(主要是路由名)...如何將RenderAction與自定義路由一起使用?

這裏是我們的映射之一:

// Route für Tools 
     route = routes.MapRoute(
      name: "Tool", 
      url: "tool/{controller}/{action}", 
      defaults: new { controller = "Home", action = "Index" }, 
      namespaces: new[] { "Web.Controllers.Tool" }); 
     route.DataTokens["UseNamespaceFallback"] = false; 
用的RenderAction(控制器,動作),我們的信息一半

所以,我們需要的是不管它是所謂的方法來分配「工具routename或名稱或「在」工具/控制器/動作「中。

回答

0

我們開始使用的路線爲我們的MVC項目,所以我們basicly取代的ActionLink()與RouteLink()

不知道如果你認識到一個無關與其他。 ActionLinkRouteLink最終調用了與UrlHelper完全相同的方法。唯一的區別是ActionLink發送路由名稱的null值。

指定路由名稱時,只會檢查1個路由以查看它是否與請求匹配。否則,所有路由將按照它們在路由表中註冊的順序進行檢查。第一條匹配路線獲勝。

路由名稱是(將暗示)路由的name

var url = Url.RouteUrl("Tool", new { controller = "Tool", action = "Index" }); 

這就是說,目前還不清楚你的問題是你想達到什麼目的。通常情況下,您將在路線中使用文字段來使用僅適用於特定路線的默認路線值。

route = routes.MapRoute(
    name: "Tool", 
    url: "tool/{action}", 
    defaults: new { controller = "Tool", action = "Index" }); 

在這種情況下,在URL力它的工具段只匹配網址/tool開始。這也意味着無法覆蓋默認設置controller = "Tool"。但請注意,在請求期間,文字URL完全與放入路由值字典的內容無關。

此外,您似乎通過設置路由的命名空間參數來打敗使用命名空間的目的,然後將UseNamespaceFallback設置爲false。除非你的應用程序以某種方式明確地使用了命名空間,否則這是毫無意義的。

至於RenderAction,框架使用controlleraction來查找要呈現的子動作,並傳遞您提供給該方法的任何值。它會構建一個新的HttpRequest,然後執行它,就好像您正在使用該組路由值一樣。就路由而言,如果您在呈現的視圖(或者可能在該操作中處於流水線上的任何filters)上調用ActionLinkRouteLink等,這只是很重要的。除此之外,這個虛假的請求實際上並沒有命中路由表。有關如何使用RenderAction的詳細信息,請參見this post

0

你混淆了兩個不相關的想法。授予MVC本身也有點困惑,這就是爲什麼在MVC 6中,他們已經放棄了子操作並創建了「視圖組件」。

簡而言之,子動作(這是您在撥打RenderAction時所使用的)利用路由基礎結構,但它們不是真實的動作,並且通常不會作爲路由暴露給外部世界。換句話說,內部生成的用於獲取子操作的URL實際上並不重要,只要它到達操作即可。因此,您不需要自定義Tool路線進行兒童操作。你只需要一個控制器和動作,默認路由就足以讓你到達那裏。這就是爲什麼沒有Html.RenderRouteHtml.Route動作與Html.RenderActionHtml.Action相對應。沒有必要。

現在,路由工作的方式是,項目中的所有控制器都拉入,然後基於路由,從該集合中挑選出最匹配的一個。通過將你的控制器分隔成不同的命名空間,你可以在每個命名空間中重複使用控制器名稱,但是你必須爲任何路由指定命名空間,以便將選擇縮小到正確的控制器/操作對,這就是爲什麼我認爲你感覺需要在這裏使用自定義路線。我自己並不真的這樣做,但我認爲你應該能夠通過命名空間作爲路由值:

@Html.Action("Action", "Controller", new { namespace = "Web.Controllers.Tool" }) 
相關問題