客户是一个List<string>
。
RedirectToAction("ListCustomers", new { customers = customers });
当我发送列表时,它包含 4 个项目,但是当我在控制器方法中收到它时,它只有一个项目,并且它是通用列表类型。这似乎不是我想要的。但是如何在控制器方法之间传递比字符串和整数更复杂的数据呢?
客户是一个List<string>
。
RedirectToAction("ListCustomers", new { customers = customers });
当我发送列表时,它包含 4 个项目,但是当我在控制器方法中收到它时,它只有一个项目,并且它是通用列表类型。这似乎不是我想要的。但是如何在控制器方法之间传递比字符串和整数更复杂的数据呢?
重定向时不能发送复杂对象。重定向时,您正在向目标操作发送 GET 请求。发送 GET 请求时,您需要将所有信息作为查询字符串参数发送。这仅适用于简单的标量属性。
因此,一种方法是在重定向之前将实例保存在服务器上的某个位置(例如在数据库中),然后仅将 id 作为查询字符串参数传递给目标操作,该操作将能够从存储对象的位置检索对象:
int id = Persist(customers);
return RedirectToAction("ListCustomers", new { id = id });
在目标动作内部:
public ActionResult ListCustomers(int id)
{
IEnumerable<string> customers = Retrieve(id);
...
}
另一种可能性是将所有值作为查询字符串参数传递(请注意查询字符串的长度有限制,该限制会因浏览器而异):
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>;
...
}