Вы не можете отправлять сложные объекты при перенаправлении. При перенаправлении вы отправляете запрос GET на целевое действие. При отправке запроса GET вам нужно отправить всю информацию в виде параметров строки запроса. И это работает только с простыми скалярными свойствами.
Таким образом, один из способов - сохранить экземпляр где-то на сервере перед перенаправлением (например, в базе данных), а затем передать только идентификатор в качестве параметра строки запроса в целевое действие, которое сможет получить объект, откуда он хранился:
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>;
...
}