フィルタリングにform
使用するプレーンなバニラの複数選択リストボックスがあります。
したがって、標準的な設計では、フィルターを GET 操作として実行します。したがって、フォームを送信すると、完全に受け入れ可能な URL が得られます。
http://example.com/Matrix?role=1&role=6&role=2
roles
これは、次の引数に完全にバインドされます。
[HttpGet]
public virtual ViewResult Matrix(List<int> roles) { ... }
返されたフィルター処理されたビューにはpost
、サーバーに ed する必要があるフォームが含まれています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 から消え、フィルターは保持されますが、フォーム自体は空/リセットされます。