【问题标题】:How to get route data keys from url parameter in custom Route constructor via Regex?如何通过正则表达式从自定义路由构造函数中的 url 参数获取路由数据键?
【发布时间】:2013-06-03 14:58:23
【问题描述】:

基本上,我需要从路由字符串中获取路由值键数组。正则表达式看起来不错,但我似乎无法理解正则表达式。

来自"{controller}/{action}/{id}"

到带有值的string[] "controller", "action", "id"

这是我得到的最接近的Regex.Split(url, "/{(.*?)}/");

但我得到了不寻常的结果:"{controller}", "action", "{id}"

【问题讨论】:

  • 为了澄清您的问题,您是否尝试使用 正则表达式 来修改 URL 路径?如果是这种情况,请看一下这个问题。 stackoverflow.com/questions/9628857/…
  • 您是针对"{controller}/{action}/{id}" 运行正则表达式,还是实际上针对正则表达式从URL 中看到的内容运行它,即"controller/action/id"?我问是因为大括号永远不会出现在您的 URL 中(我希望如此)。
  • @mr.smors:他想解析路由模式。路由框架已经这样做了,但没有在任何地方公开它。

标签: c# asp.net-mvc regex


【解决方案1】:

避免使用 Regex 可能会便宜很多。试试:

var myRoute = "{controller}/{action}/{id}";
string[] results = myRoute.Split(new[] { '{', '}', '/' }, StringSplitOptions.RemoveEmptyEntries);

【讨论】:

    【解决方案2】:

    其实你可以调用someContext.RouteData.Values.Keys.ToArray(),比如someContext可以是RequestContext。确保导入 System.Linq 命名空间以获取 ToArray() 扩展方法。

    如果你想通过一个动作来完成,你需要通过 ControllerContext 来完成。例如,

    public ActionResult Index()
    {
        var routeDataKeys = ControllerContext.RouteData.Values.Keys.ToArray();
        var content = String.Empty;
    
        foreach (var key in routeDataKeys)
        {
            content += "   " + key;
        }
        return Content(content);
    }
    

    您将获得属于当前选择的 Route 的所有键,不带花括号。

    【讨论】:

      【解决方案3】:

      不需要正则表达式:

      List<string> parts = str.Split('/').Select(p => p.Trim(new []{ '}', '{' })).ToList();
      

      【讨论】:

      • 比需要的更复杂。不需要 LINQ 投影或 ToList() 强制枚举。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2017-06-13
      • 1970-01-01
      • 2015-11-03
      • 2019-09-30
      相关资源
      最近更新 更多