4

お客様はList<string>.

RedirectToAction("ListCustomers", new { customers = customers }); 

そして、リストを送信すると4つのアイテムが含まれますが、コントローラーメソッドで受信すると、アイテムは1つしかなく、タイプはジェネリックリストです。それは私が望むものではないようです。しかし、コントローラーのメソッド間で文字列や整数よりも複雑なデータを渡すにはどうすればよいでしょうか?

4

1 に答える 1

8

リダイレクト時に複雑なオブジェクトを送信することはできません。リダイレクトするときは、ターゲット アクションに GET リクエストを送信しています。GET リクエストを送信するときは、すべての情報をクエリ文字列パラメーターとして送信する必要があります。これは、単純なスカラー プロパティでのみ機能します。

したがって、1 つの方法は、リダイレクトする前にサーバー上のどこかにインスタンスを保持し (データベースなど)、ID のみをクエリ文字列パラメーターとしてターゲット アクションに渡し、格納された場所からオブジェクトを取得できるようにすることです。

int id = Persist(customers);
return RedirectToAction("ListCustomers", new { id = id });

ターゲットアクション内:

public ActionResult ListCustomers(int id)
{
    IEnumerable<string> customers = Retrieve(id);
    ...
}

もう 1 つの可能性は、すべての値をクエリ文字列パラメーターとして渡すことです (ブラウザーによって異なるクエリ文字列の長さに制限があることに注意してください)。

public ActionResult Index()
{
    IEnumerable<string> customers = new[] { "cust1", "cust2" };
    var values = new RouteValueDictionary(
        customers
            .Select((customer, index) => new { customer, index })
            .ToDictionary(
                key => string.Format("[{0}]", key.index),
                value => (object)value.customer
            )
    );
    return RedirectToAction("ListCustomers", values);
}

public ActionResult ListCustomers(IEnumerable<string> customers)
{
    ...
}

さらに別の可能性は、TempData を使用することです (推奨されません)。

TempData["customer"] = customers;
return RedirectToAction("ListCustomers");

その後:

public ActionResult ListCustomers()
{
     TempData["customers"] as IEnumerable<string>;
    ...
}
于 2012-05-29T07:22:40.400 に答える