2011-09-06 150 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