使用多值键创建RouteValueDictionary

15

我想返回一个RedirectToRouteResult,将用户重定向到以下格式的URL:

/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 } }
};

怎么才能让这个工作起来?

2个回答

15

这是框架中确实缺失的一件事情。你最好手动完成:

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());
}

将此代码放入自定义扩展方法中可以提高可读性。


谢谢 - 运行得很好!(这使得测试有点更加困难 - 你必须模拟控制器的上下文和UrlHelper - 但我想那就是它的方式。) - Dave Mateer

0

我曾经遇到这样的情况,即我甚至不知道提供多次的键的名称。由于查询字符串接受多个键作为逗号分隔列表,因此我发现编写一个基于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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接