2015-01-15 4 views
0

У меня есть два действия в мой контроллер, когда вызов пользователю один мне нужно перенаправить его на другой и пройти сложный объект:MVC прохождение сложного объекта к действию

первое действие:

public virtual ActionResult Index(string Id) { 
      var input = new CustomInput(); 
      input.PaymentTypeId = Id; 
      return RedirectToAction(MVC.Ops.SPS.Actions.Test(input)); 
     } 

второй действие:

public virtual ActionResult Test(CustomInput input) { 
      return View(); 
     } 

Задача состоит в том, что входной сигнал принимает значение null при втором действии. как я могу это решить?

+0

возможный дубликат [Передача данных между различными методами действий контроллера] (HTTP : //stackoverflow.com/questions/15385442/passing-data-between-different-controller-action-methods) –

+0

Это совершенно не нужно. Просто передайте 'Id' из метода' Index() 'в метод' Test() '- возвращайте RedirectToAction (" Test ", new {ID = Id});' и измените метод на 'public ActionResult Test (int ID) 'затем создайте новый' CustomInput' в методе 'Test()'. –

+0

Если вы действительно не обеспокоены тем, какой URL будет отображаться в браузере, вы можете просто попробовать ** return Test (input); ** и он будет работать, как ожидалось. –

ответ

2

Вы можете решить эту проблему, используя временные данные, чтобы временно сохранить значение, из которого второй метод получает это значение.

public virtual ActionResult Index(string Id) 
{ 
    var input = new CustomInput(); 
    input.PaymentTypeId = Id; 
    TempData["TheCustomData"] = input; //temp data, this only sticks around for one "postback" 
    return RedirectToAction(MVC.Ops.SPS.Actions.Test()); 
} 


public virtual ActionResult Test() 
{ 
     CustomInput = TempData["TheCustomData"] as CustomInput; 
     //now do what you want with Custom Input 
     return View(); 

} 

Вы можете держать TempData идти так долго, как это никогда не нуль, используя метод .keep(), как это,

if (TempData["TheCustomData"] != null) 
     TempData.Keep("TheCustomData"); 
+0

чем вы, это хорошо работает =) –

0

Я хочу, чтобы убедиться, что вы знаете, что RedirectToAction создает новый HTTP запросите, чтобы это создало другой GET, и все, что вы можете передать, - это RouteValueDictionary объект, который похож на параметры строки запроса, который является списком пар ключей и значений строки. Тем не менее, вы не можете передать сложный объект своим способом кода, однако решение TempData, упомянутое в @kyleT, будет работать.

Моя рекомендация, основанная на вашем коде, заключается в том, чтобы избежать двух действий и перенаправить друг друга, если вы не делаете что-то большее, чем то, что вы упомянули в своем вопросе. Или вы можете сделать действие Test, принимающее параметр id, в вашем действии Index будет содержаться только RedirectToAction, передающий идентификатор в качестве параметра маршрута.

Edit: Кроме того, если у вас нет примитивных свойств вы можете передать объект как следующий (благодаря @Stephen Muecke)

return RedirectToAction("Test",(input); 
+0

Вы ** можете ** передать сложный объект (внутри метода генерируется 'RouteValueDictionary' на основе значения' .ToString() 'каждого свойства в модели), но он работает только для типов значений (сложные объекты и коллекции не передаются) –

+0

@StephenMuecke, хорошая точка зрения, я отредактировал свой ответ, чтобы показать его как пример –

+0

Вам не нужен бросок - это может быть просто «RedirectToAction» («Test», input); '. Но его не рекомендуется в любом случае и создает уродливый маршрут - и если есть много свойств, вы скоро превысите параметры строки запроса. –

Смежные вопросы