2011-09-27 134 views
1

ActionLink结果“http:// localhost:5089/Article/GetArticlesByCategory?category = ASP.NET & categoryId = 2”。我想显示链接类型“http:// localhost:5089/Blog/ASP.NET”。什么是错误的路线命名为“文章”。MVC 3路由问题

路线:

routes.MapRoute(
       "Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "Home", action = "index", id = UrlParameter.Optional } // Parameter defaults 
      ); 

routes.MapRoute(
       "Article", 
       "Blog/{category}", // 
       new { controller = "Article", action = "GetArticlesByCategory", category = UrlParameter.Optional, categoryId = UrlParameter.Optional } 

链接:

@Html.ActionLink(k.Name, "GetArticlesByCategory", "Article", 
new { category = k.Name, categoryId = k.CategoryId }, null) 

解决

GetArticlesByCategory参数整数的categoryId改为>>串类别,并替换操作代码,以新的参数(字符串类)

条路线替换为:

 routes.MapRoute(
      "Category", 
      "Blog/{category}", 
      new { controller = "Article", action = "GetArticlesByCategory", category = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

ActionLink的替换:

@Html.ActionLink(k.Name, "GetArticlesByCategory", "Article", 
new { category = k.Name }, null) 

回答

2

有几个问题。首先,也是最重要的一点,您的路线以错误的顺序指定。应该最后定义默认路由。其次,永远不要用两个可选参数定义路线。这只会导致太多问题。

尝试为您的路线如下:

routes.MapRoute(
    "CategoryAndId", 
    "Blog/{category}/{categoryId}", 
    new { controller = "Article", action = "GetArticlesByCategory" } 
); 

routes.MapRoute(
    "CategoryOnly", 
    "Blog/{category}", 
    new { controller = "Article", action = "GetArticlesByCategory", 
     category = UrlParameter.Optional } 
); 

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "index", 
     id = UrlParameter.Optional } // Parameter defaults 
); 
1

你是不是在路线

routes.MapRoute(
       "Article", 
       "Blog/{action}/{category}/{categoryId}", // 
       new { controller = "Article", action = "GetArticlesByCategory", category = UrlParameter.Optional, categoryId = UrlParameter.Optional } 

我建议你使用菲尔哈克的线路调试,http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx指定动作。

@Html.ActionLink(k.Name, "GetArticlesByCategory", "Article", 
    new { category = k.Name }, new { @title = "Kategorisindeki Makaleler", @class = "selected" }) 

既然你不想类别ID在:用于调试你的MVC路线

+0

自认倒霉的路线,但你的建议很好TY改变。 – ALKAN

+0

控制器的名称和您需要用于此路线的操作的名称是什么? – Brettski

+0

controller =“Article”and action =“GetArticlesByCategory” – ALKAN

0

如果您希望链接显示为http://localhost:5089/Blog/ASP.NET,你需要改变ActionLink的这样一个伟大的方式链接,没有必要把它在该路由不是由ActionLink的,因为它需要一个类别ID参数以及匹配

编辑

如果你想从阅读类别ID该路线,它需要被添加到路线。否则它只会作为参数追加(就像在你的原始示例中一样)。

如果你改变你的路线:

"Blog/{categoryId}/{category}" 
or 
"Blog/{category}/{categoryId}" 

该链接现在看起来像Blog/2/ASP.NETBlog/ASP.NET/2但如果你想的categoryId从URL中读取,那么我不认为你有太多的选择

+0

GetArticlesByCategory的categoryId参数 – ALKAN