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",page = 2
如果您尝试生成这样的规则
@Html.RouteLink(i.ToString(),"News")
路由系统将使用已存在的变量,如lang和page,并将生成完全相同的URL – / pl / News / Index / 2.
当然,您在Html.RouteLink中以匿名类型传递的值将被优先处理,并将覆盖当前请求中的值.因此,在您的示例中,您应该考虑生成链接时的URL.
优先顺序是:
>以匿名类型传递的变量
>请求变量
>路线中定义的默认值.
看来这部分
lang = ViewBag.Lang
没有用,因为如果你不提供lang将从请求中获取 – 所以它将被保留.
更新(可能不相关):
您还应该记住,如果规则有多个匹配项 – 路由系统将选择满足约束条件的第一个匹配项(例如,请求中的值不应与默认变量冲突)
UPDATE2:
路由系统使用请求变量直到第一个显式指定的变量(通过匿名类型),所以如果你明确指定lang – 没有请求变量将被重用(在你的情况下,因为lang是你网址中的第一个段)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。