Создать RouteValueDictionary с многозначными ключами
Я хотел бы вернуть 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 } }
};
В чем секрет, чтобы сделать эту работу?
Ответы
Ответ 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());
}
Включение этого в собственный метод расширения может повысить читаемость, конечно.
Ответ 2
Я был в том случае, когда я даже не знаю имен ключей, которые предоставляют несколько раз. И так как запрос вызывает несколько ключей как список, разделенный комой. Я счел полезным написать метод расширения, основанный на ответе Дарина.
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;
}