ModelBinding List正确地在RedirectToAction()
本文关键字:RedirectToAction 正确地 List int ModelBinding | 更新日期: 2023-09-27 18:02:03
我有一个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
为什么会发生这种情况?我怎么做才能使生成的URL与漂亮的URL相似?
我目前使用的工作是使用TempData
将数据传递回来,但这会导致数据从URL中消失,虽然保留了过滤器,但表单本身是空的/重置。
如果我正确阅读源代码,即使路径构建过程相当智能,它仍然在构建查询参数上做简单的Convert.ToString()
:
stringBuilder1.Append(Uri.EscapeDataString(str));
stringBuilder1.Append('=');
stringBuilder1.Append(Uri.EscapeDataString(Convert.ToString(obj, (IFormatProvider) CultureInfo.InvariantCulture)));
所以你不能做太多来让你的url漂亮。在这种情况下,我看到的唯一选择是手动构建url并将其传递到return Redirect(url)