加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 用破折号路由值

发布时间:2020-12-16 09:52:32 所属栏目:asp.Net 来源:网络整理
导读:我有这条路线: routes.MapRoute( "News","News/{id}-{alias}",new { controller = "News",action = "Show" },new { id = @"^[0-9]+$" },namespaces: new[] { "Site.Controllers" } ); 这条路线适用于网址: http://localhost:54010/News/6-news 但不适用于
我有这条路线:

routes.MapRoute(
            "News","News/{id}-{alias}",new { controller = "News",action = "Show" },new
                {
                    id = @"^[0-9]+$"
                },namespaces: new[] { "Site.Controllers" }
        );

这条路线适用于网址:

http://localhost:54010/News/6-news

但不适用于这样的url:

http://localhost:54010/News/6-nice-news

如何在我的路线值中使用破折号“别名”?

EDITED

像这样的路线:

"News/{id}_{alias}"

适用于两个网址:

http://localhost:54010/News/6_news
http://localhost:54010/News/6_nice-news

解决方法

问题在于你的模式:News / {id} – {alias}因为路由正在贪婪地解析模式.

所以url http:// localhost:54010 / News / 6-news生成以下标记:

id = 6,alias = news

但http:// localhost:54010 / News / 6-nice-news会生成以下标记:

id = 6-nice,alias = news

并且id = 6-nice令牌将失败你的路由约束@“^ [0-9] $”.所以你会得到404.

现在有办法配置MVC的这种行为,所以你有以下选择:

>使用除破折号以外的其他东西.正如您所说,结合破折号和连字符的工作原理.
>采用flem方法并在控制器操作中的id和别名内解析
>您可以创建一个自定义Route,它将重新解析.例如,将id = 6-nice,alias = news转换为id = 6,alias = news-nice

我将向您展示一个原始的(没有任何错误处理或良好的编码实践!)选项3的实现,以帮助您入门.

所以你需要从Route继承:

public class MyRoute : Route
{
    public MyRoute(string url,RouteValueDictionary defaults,RouteValueDictionary constraints,RouteValueDictionary dataTokens) 
        : base(url,defaults,constraints,dataTokens,new MvcRouteHandler())
    {
    }

    protected override bool ProcessConstraint(HttpContextBase httpContext,object constraint,string parameterName,RouteValueDictionary values,RouteDirection routeDirection)
    {
        var parts = ((string) values["id"]).Split('-');
        if (parts.Length > 1)
        {
            values["id"] = parts[0];
            values["alias"] = // build up the alias part
                string.Join("-",parts.Skip(1)) + "-" + values["alias"];
        }
        var processConstraint = base.ProcessConstraint(httpContext,constraint,parameterName,values,routeDirection);
        return processConstraint;
    }
}

然后你只需要注册你的路线:

routes.Add("News",new MyRoute("News/{id}-{alias}",new RouteValueDictionary(new {controller = "News",action = "Show"}),new RouteValueDictionary(new
                                        {
                                             id = @"^[0-9]+$"
                                        }),new RouteValueDictionary()));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读