2011-09-06 148 views
0

我遇到了一個問題,如何幫助者操作方法和路由工作。我創建了一個輔助方法來創建搜索鏈接Asp.net MVC 3與UrlHelper.Action路由問題

public static string SearchLink(this System.Web.Mvc.UrlHelper helper, string key, string loc, int p) 
{ 
    key = Tools.GetLinkRewrite(key.Trim().ToLower()); 
    loc = Tools.GetLinkRewrite(loc.Trim().ToLower()); 

    string url = ""; 

    if (!String.IsNullOrEmpty(key) && !String.IsNullOrEmpty(loc)) 
    { 
     if (p > 0) 
      url = helper.Action("Index", "Search", new { keyword = key, location = loc, page = p }); 
     else 
      url = helper.Action("Index", "Search", new { keyword = key, location = loc }); 
    }else 
    if (!String.IsNullOrEmpty(key)) 
    { 
     if (p > 0) 
      url = helper.Action("Index", "Search", new { keyword = key, page = p }); 
     else 
      url = helper.Action("Index", "Search", new { keyword = key }); 
    }else 
    if (!String.IsNullOrEmpty(loc)) 
    { 
     if (p > 0) 
      url = helper.Action("Index", "Search", new { location = loc, page = p }); 
     else 
      url = helper.Action("Index", "Search", new { location = loc }); 
    }else 
    url = helper.Action("Index", "Search"); 

    return url.Replace("%20","+"); 
} 

這裏是我的路由

 routes.MapRoute(
      "Search", 
      "{keyword}-jobs-in-{location}", 
      new { controller = "Search", action = "Index" } 
     ); 

     routes.MapRoute(
      "Searchlocation", 
      "jobs-in-{location}", 
      new { controller = "Search", action = "Index" } 
     ); 

     routes.MapRoute(
      "Searchkeyword", 
      "{keyword}-jobs", 
      new { controller = "Search", action = "Index" } 
     ); 

現在,當我打電話SearchLink任何行動與參數方程。 Url.SearchLink(「asp.net」,「」,0),它給我正確的網址爲/asp.net-jobs

但是,如果從相同的參數調用SearchController的索引操作相同的方法,它會給我/ asp .net-jobs-in-

雖然我可以通過在上面的擴展方法中使用RouteUrl而不是Action來實現正確的行爲(感謝Craig給予hint),但是我想理解它爲什麼會發生混亂。

在此先感謝

回答

0

您的路線定義不是問題嗎? 現在他們被定義的方式,我無法得到它的工作。
由於您沒有爲它們定義的{controller}和{action}佔位符,它將始終使用SearchController和它的方法Index;但你在你的輔助函數(搜索,搜索關鍵詞和搜索位置)中定義了其他動作。當我相應地改變路線時,我完全沒有任何問題@ Url.SearchLink(「key1」,「」,0)在整個應用程序中返回/ key1-jobs ..

+0

是的,我想調用索引操作SearchController爲3個網址。我在SearchController「Index」和「RecentSearch」中只有2個動作。對於關鍵字和位置的所有組合,生成的最新搜索視圖網址都是正確的。在索引視圖我顯示了一些類似的搜索鏈接,使用相同的輔助方法不能正確生成。 – Neo

+0

還有哪些其他路線已經註冊或已註冊?我似乎很難做這個工作。如果我只是使用你有的路線,並瀏覽到localhost/asp.net-jobs(使其工作的唯一方法)'url = helper.Action(「Searchkeyword」,new {keyword = key});'在調用Url.Searchlink(「myKey」,「」,0)時返回null,原因是SearchController中沒有名稱* Searchkeyword *。 Url.Action的第一個參數是動作的名稱,而不是路由的名稱。所以我很好奇這是如何適用於你... –

+0

哦,我真的很抱歉。我已經更新了我的問題中的擴展方法。我在修正和發佈SO時弄亂了功能代碼。如果你想我可以給你一個示例項目代碼顯示問題。 – Neo