-1

我有一个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 中消失,尽管保留了过滤器,但表单本身是空的/重置。

4

1 回答 1

0

如果我正确阅读了源代码,即使路径构建过程相当聪明,它Convert.ToString()在构建查询参数方面仍然很简单:

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

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

于 2013-03-04T18:11:48.780 回答