2012-05-29 2 views
4

клиентов - List<string>.Как отправить массив другому методу контроллера в asp.net mvc?

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

И когда я посылаю список он содержит 4 пунктов, но когда я получаю его в мой метод контроллера имеет только один элемент, и это типа общего списка. Кажется, это не то, чего я хочу. Но как передавать более сложные данные, чем строки и целое число между методами контроллера?

ответ

8

Вы не можете отправлять сложные объекты при перенаправлении. При перенаправлении вы отправляете запрос 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>; 
    ... 
} 
Смежные вопросы