2012-02-15 3 views
14

Я хотел бы вернуть RedirectToRouteResult, который отправляет пользователей на URL, как следующие:Создать RouteValueDictionary с многозначных ключами

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

В чем секрет, чтобы сделать эту работу?

ответ

13

Это одна вещь, которая действительно отсутствует в каркасе. Лучше всего вручную раскатать:

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

Сведя в метод пользовательского расширения может повысить читаемость конечно.

+0

+1 Элегантное решение, Дарин. –

+0

Спасибо - отлично работает! (Это делает тестирование немного сложнее - вы должны издеваться над Контекстом и UrlHelper контроллера, но я думаю, что так оно и есть.) –

0

Я был в том случае, когда я даже не знаю имен ключей, которые предоставляют несколько раз. И так как запрос вызывает несколько ключей как список, разделенный комой. Я счел полезным написать метод расширения, основанный на ответе Дарина.

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; 
    } 
Смежные вопросы