【问题标题】:Create RouteValueDictionary with multivalued keys使用多值键创建 RouteValueDictionary
【发布时间】:2023-03-11 14:38:01
【问题描述】:

我想返回一个RedirectToRouteResult,它将用户发送到如下网址:

/MyController/MyAction/id?newid=3&newid=5&newid=7

newid 参数有多个值。

我的电话看起来像:return RedirectToAction(string.Empty, routeValues);

这是我迄今为止尝试过的,但不起作用:

// ...?newid%5B0%5D=3&newid%5B1%5D=5&newid%5B2%5D=7
var routeValues = new RouteValueDictionary {
    {"id", myid},
    {"newid[0]", 3},
    {"newid[1]", 5},
    {"newid[2]", 7},
};

// ...?newid=System.Int32%5B%5D
var routeValues = new { id = myid, newid = new int[] { 3, 5, 7 } };

// ...?newid=System.String%5B%5D
var routeValues = new { id = myid, newid = new string[] { "3", "5", "7" } };

// ...?newid=System.Int32%5B%5D
var routeValues = new RouteValueDictionary {
    {"id", myid},
    {"newid", new int[] { 3, 5, 7 } }
};

成功的秘诀是什么?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 routes


    【解决方案1】:

    这是框架中真正缺少的一件事。最好的办法是手动滚动:

    public ActionResult Foo()
    {
        var ids = new[] { 3, 5, 7 };
        var url = new UriBuilder(Url.Action("MyAction", "MyController", new { id = "123" }, Request.Url.Scheme));
        url.Query = string.Join("&", ids.Select(x => "newid=" + HttpUtility.UrlEncode(x.ToString())));
        return Redirect(url.ToString());
    }
    

    将其放入自定义扩展方法当然可以增加可读性。

    【讨论】:

    • 谢谢 - 效果很好! (它使测试变得更加困难——你必须模拟控制器的 Context 和 UrlHelper——但我想这就是它的方式。)
    【解决方案2】:

    我什至不知道多次提供的键的名称。而且由于查询字符串确实接受多个键作为逗号分隔的列表。我发现根据 Darin 的回答编写扩展方法很有帮助。

      public static UriBuilder TransformToMultiplyKeyUrl(this RouteValueDictionary self, string baseUrl)
        {
            var url = new UriBuilder(baseUrl);
            //Transform x=y,z into x=y&x=z
            url.Query = String.Join("&",
                self.SelectMany(
                    pair => ((string)pair.Value).Split(',')
                        .Select(v => String.Format("{0}={1}", pair.Key, HttpUtility.UrlEncode(v)))));
            return url;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 2014-03-27
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多