ModelBinding在RedirectToAction()</int>上正确地发出List <int>的问题

时间:2013-03-04 17:18:48

标签: c# asp.net-mvc-4 model-binding generic-list

我有form一个普通的多选列表框,我用它来过滤。

因此,通过标准设计,我将过滤器作为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

为什么会这样?我该怎么做才能让生成的网址与漂亮的网址类似?

我目前正在使用的工作是使用TempData传回数据,但这会导致数据从URL中消失,虽然保留了过滤器,但表单本身为空/重置。

1 个答案:

答案 0 :(得分:0)

如果我正确地阅读了源代码,即使路径构建过程相当聪明,它仍然可以在构建查询参数时执行简单的Convert.ToString()

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

所以你不能做很多让你的网址漂亮。我在这种情况下看到的唯一选择是手动构建您的网址并将其传递到return Redirect(url)