我有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中消失,虽然保留了过滤器,但表单本身为空/重置。
答案 0 :(得分:0)
如果我正确地阅读了源代码,即使路径构建过程相当聪明,它仍然可以在构建查询参数时执行简单的Convert.ToString()
:
stringBuilder1.Append(Uri.EscapeDataString(str));
stringBuilder1.Append('=');
stringBuilder1.Append(Uri.EscapeDataString(Convert.ToString(obj, (IFormatProvider) CultureInfo.InvariantCulture)));
所以你不能做很多让你的网址漂亮。我在这种情况下看到的唯一选择是手动构建您的网址并将其传递到return Redirect(url)