-1

フィルタリングに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 から消え、フィルターは保持されますが、フォーム自体は空/リセットされます。

4

1 に答える 1

0

ソースを正しく読んだ場合、パス構築プロセスはかなりスマートですが、Convert.ToString()クエリパラメーターの構築は簡単です。

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

そのため、URL をきれいにするために多くのことを行うことはできません。この場合に私が目にする唯一のオプションは、URL を手動で作成して渡すことです。return Redirect(url)

于 2013-03-04T18:11:48.780 に答える