2013-03-04 1 views
-1

У меня есть form с простым списком выбора ванили, который я использую для фильтрации.Проблема с ModelBinding a <int> правильно на RedirectToAction()

Итак, по стандартным конструкциям, я делаю фильтр как операцию GET. Таким образом, форма представить результаты в совершенно приемлемом URL:

http://example.com/Matrix?role=1&role=6&role=2 

который прекрасно связывается с roles аргумента:

[HttpGet] 
public virtual ViewResult Matrix(List<int> roles) { ... } 

Теперь возвращаемый фильтруются вид содержит форму, которая должна быть post-й издом к серверу поскольку он содержит моды данных, определенные в CustomViewModel. Опять же форма помещается на тот же URL и связывание происходит отлично:

[HttpPost] 
public virtual ActionResult Matrix(CustomViewModel vm, List<int> roles) 
{ 
    ... 
    //Passing the list 'roles' untouched directly to the redirect 
    //Problem sirens set off!! 
    return RedirectToAction(MVC.T4Path.To.Matrix(roles)); 
} 

Проблема возникает при попытке выполнить перенаправление. Теперь логически кажется, что это прямая переадресация с roles, переданная в качестве аргумента для сохранения фильтров. Но запрос полученный GET является:

http://example.com/Matrix?roleSelector=System.Collections.Generic.List%601%5BSystem.Int32%5D 

Почему это происходит? Что я могу сделать, чтобы сгенерированный URL-адрес был похож на симпатичный?

Работа, на которой я сейчас использую, заключается в передаче данных с помощью TempData, но это приводит к исчезновению данных из URL-адреса, и хотя фильтр сохраняется, сама форма пуста/сбрасывается.

ответ

0

Если я читаю источники правильно, даже процесс построения пути довольно умный, он по-прежнему делать простые Convert.ToString() по созданию параметров запроса:

stringBuilder1.Append(Uri.EscapeDataString(str)); 
stringBuilder1.Append('='); 
stringBuilder1.Append(Uri.EscapeDataString(Convert.ToString(obj, (IFormatProvider) CultureInfo.InvariantCulture))); 

Таким образом, вы не можете сделать многое, чтобы сделать свой адрес довольно. Единственный вариант, который я вижу в этом случае, - это создать свой url вручную и передать его в return Redirect(url)