2013-01-06 339 views
-1

我有這些在Global.asax中路由路由在MVC和鏈接

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 


     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}/{Name}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional }, 
      namespaces: new[] {"MVCTemplateProject.Controllers"} 
      ); 
     routes.MapRoute(
      name: "Post", 
      url: "{controller}/{action}/{id}/{Title}", 
      defaults: new {controller = "Post", action = "Index", id = UrlParameter.Optional, Title = UrlParameter.Optional}, 
      namespaces: new[] {"MVCTemplateProject.Controllers"} 
      ); 

     routes.MapRoute(
      name: "GetPostByCategoryName", 
      url: "{controller}/{action}/{CategoryName}", 
      defaults: 
       new {controller = "Post", action = "Index", id = UrlParameter.Optional, CategoryName = UrlParameter.Optional}, 
      namespaces: new[] {"MVCTemplateProject.Controllers"} 
      ); 

我有這個HREF http://mysite.com/Post/GetPostsByTagId/3/a 一個鏈接,如果我上線點擊並重定向到具有相同的地址 相同的鏈接頁面所以我的鏈接有這個地址 http://mysite.com/Post/GetPostsByTagId/3/a/2/asdasd ,提高錯誤 這是我的鏈接語法

<a href="@Url.Action(MVC.Post.ActionNames.GetPostsByCategoryId,MVC.Post.Name)\@category.Id\@category.Name.ToSeoUrl()">@category.Name</a> 
+0

此路徑在配置中位於何處? –

+0

你有沒有嘗試添加另一條路線,將知道如何處理第二個(更長)的網址? –

回答

0

這個答案可能不是完全ANSW呃你的問題,但它應該幫助你。

URL.Action()

首先一個小東西。您鏈接的網址是使用反斜槓,而斜槓應該使用。因此,改變

<a href="@Url.Action(MVC.Post.ActionNames.GetPostsByCategoryId,MVC.Post.Name)\@category.Id\@category.Name.ToSeoUrl()">@category.Name</a> 

<a href="@Url.Action(MVC.Post.ActionNames.GetPostsByCategoryId,MVC.Post.Name)/@category.Id/@category.Name.ToSeoUrl()">@category.Name</a> 

對於我們來幫助你,也請您顯示當前的結果是什麼。

同樣在這個部分,你會想要使用route values for the additional url parameters,這樣MVC路由系統就可以把你的SEO優化的URL放在哪裏。所以,那麼它會是這個樣子:

<a href="@Url.Action(MVC.Post.ActionNames.GetPostsByCategoryId,MVC.Post.Name, new { id = category.Id, CategoryName = category.Name.ToSeoUrl() })">@category.Name</a> 

MVC路由

你的問題的主要部分是有關路由。當前路線設置的方式是,第一個將捕獲的所有內容,因爲該路線中的所有參數都是可選的。

當您使用Url.Action()或者當一個請求與路由相匹配時,將使用匹配的第一種可能性。它會而不是嘗試找到可能的最佳匹配。

所以這個想法是,你將不得不將最具體的路線放在上面。如果它們匹配,那麼它們會被使用,如果沒有,它會繼續下去,直到最終結束,通常是一條全部通路,就像MVC自動爲您提供的路線一樣。

您的第二條和第三條路線仍然有其參數可選。你是不是真的認爲這些路線的參數應該被要求?

第二個似乎比第三個更具體,因爲它有4個參數,而另一個是3個。第一個似乎被認爲是一條全面的路線。

作爲最後一部分,如果您指定了一個默認值,那麼它仍然可以被其他任何東西替代。所以如果你想要它匹配PostController,你必須把它放在url,而不是defaults

這將導致以下改變路由規則:

routes.MapRoute(
    name: "Post", 
    url: "Post/Index/{id}/{Title}", 
    defaults: new { controller = "Post", action = "Index" }, 
    namespaces: new[] {"MVCTemplateProject.Controllers"} 
); 

routes.MapRoute(
    name: "GetPostByCategoryName", 
    url: "Post/GetPostByCategoryName/{CategoryName}", 
    defaults: new { controller = "Post", action = "GetPostByCategoryName" }, 
    namespaces: new[] {"MVCTemplateProject.Controllers"} 
); 

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}/{Name}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional }, 
    namespaces: new[] {"MVCTemplateProject.Controllers"} 
); 

你可以看到,url s的固定爲PostController,但路線不會奇蹟般地知道控制器和動作會是什麼,所以你仍然必須在你的defaults中指定。

結論

嘗試和了解MVC路由系統多一點。這個解釋應該可以幫助你一點點。或者它甚至可能幫助你解決你的問題。

這是不完全清楚(如果這是)你需要什麼。如果你詳細說明你的問題,我可以詳細說明我的答案。