我的ASP.NET MVC3应用程序中的路由有一些问题,确切地说它不能正常工作.
Global.asax中的路由定义
routes.MapRoute(
"News", // Route name
"{lang}/{controller}/{action}/{page}/{id}", // URL with parameters
new { lang = "pl", controller = "News", action = "Index", page = 1, id = UrlParameter.Optional } // Parameter defaults
);
所以我想在2种情况下使用它:
> / {lang} / {controller} / {action} / {page} – 转到特定的分页页面
> / {lang} / {controller} / {action} / {page} / {id} – 记住当前页面,然后转到具有特定ID的页面.
生成我使用的链接:
@Html.RouteLink(i.ToString(), "News", new { lang = ViewBag.Lang, page = i })
其中i是页数,而lang是语言.
在控制器我处理它女巫动作:
public ViewResult Index(string lang, int page = 1)
问题
@ Html.RouteLink给了我链接/ pl /新闻/索引/ 2(当点击’2’时),但是我的控制器没有处理它,页面仍然是’1′.因此,当我点击两次相同的链接时,它会给出:/ pl / News / Index / 2/2然后页面等于’2′.
如果有人可以解释我它是如何工作的,我该怎么做才能解决它?
任何帮助,将不胜感激.
解决方法:
我想你在这里缺少的是路由系统使用当前请求中的变量值来生成出站规则.
例如 – 如果您在页面/ pl / News / Index / 2上,那么
lang = "pl", controller = "News", action = "Index", page = 2
如果您尝试生成这样的规则
@Html.RouteLink(i.ToString(), "News")
路由系统将使用已存在的变量,如lang和page,并将生成完全相同的URL – / pl / News / Index / 2.
当然,您在Html.RouteLink中以匿名类型传递的值将被优先处理,并将覆盖当前请求中的值.因此,在您的示例中,您应该考虑生成链接时的URL.
优先顺序是:
>以匿名类型传递的变量
>请求变量
>路线中定义的默认值.
看来这部分
lang = ViewBag.Lang
没有用,因为如果你不提供lang将从请求中获取 – 所以它将被保留.
更新(可能不相关):
您还应该记住,如果规则有多个匹配项 – 路由系统将选择满足约束条件的第一个匹配项(例如,请求中的值不应与默认变量冲突)
UPDATE2:
路由系统使用请求变量直到第一个显式指定的变量(通过匿名类型),所以如果你明确指定lang – 没有请求变量将被重用(在你的情况下,因为lang是你网址中的第一个段)