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中消失,虽然保留了过滤器,但表单本身是空的/重置。

ModelBinding List<int>正确地在RedirectToAction()

如果我正确阅读源代码,即使路径构建过程相当智能,它仍然在构建查询参数上做简单的Convert.ToString():

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

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

相关文章:
  • 没有找到相关文章