URL参数仅在具有查询字符串

时间:2016-09-08 17:54:05

标签: asp.net asp.net-mvc asp.net-mvc-routing url-parameters

我遇到了带参数的网址路径问题。我跟着这个链接: ASP.NET MVC 5 culture in route and url

我在控制器博客下有标记操作。根据文化,我在路线配置中创建了两条路线:

routes.MapRoute(
     name: "TagWithCulture",
     url: "{culture}/{controller}/{action}/{Name}/{page}/{pageNo}",
     defaults: new { controller = "Blog", action = "Tag", Name = UrlParameter.Optional, pageNo = UrlParameter.Optional, page = UrlParameter.Optional },
     constraints: new { culture = new CultureConstraint(defaultCulture: "ar", pattern: "[a-z]{2}") }
);

routes.MapRoute(
     name: "Tag",
     url: "{controller}/{action}/{Name}/{page}/{pageNo}",
     defaults: new { controller = "Blog", action = "Tag", Name = UrlParameter.Optional, pageNo = UrlParameter.Optional, page = UrlParameter.Optional }
)

控制器中的操作就是这行代码接受2个参数:

 public async Task<ActionResult> Tag(string Name, int? pageNo)

问题是:当我用这样的查询字符串浏览网址时:

localhost:1025/blog/tag?name=XYZ

并调试,我可以看到&#39; name&#39;参数有一个值,否则,通过浏览网址和应用路由:

localhost:1025/blog/tag/XYZ

参数&#39; name&#39;变为空!

这引起了头痛,是否有解决方案呢?

1 个答案:

答案 0 :(得分:0)

如上所述,通过将特定路由置于默认路由之上,首先处理它们。然后,使您的路线更具体,这样他们就不会不恰当地捕捉到不是blog的东西。

我不确定pagepageNo是否都是必需的 - 它们不在您的操作方法中,所以我不假设。

routes.MapRoute(
   name: "Tag",
   url: "blog/tag/{Name}/{pageNo}",
   defaults: new { controller = "Blog", action = "Tag", pageNo = UrlParameter.Optional }
);

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

按照您在问题中的方式执行此操作无法按预期运行,因为转到/会尝试映射到blog/tag操作。