2012-08-24 21 views
10

Quiero pasar más de un parámetro del método RedirectToActionCómo pasar la lista en Redirecttoaction

¿cómo puedo pasar?

My One Acción Método

[HttpPost, ActionName("SelectQuestion")] 
    public ActionResult SelectQuestion(string email,List<QuestionClass.Tabelfields> model) 
    { 

     List<QuestionClass.Tabelfields> fadd = new List<QuestionClass.Tabelfields>(); 
     for (int i = 0; i < model.Count; i++) 
     { 
      if (model[i].SelectedCheckbox == true) 
      { 
       List<QuestionClass.Tabelfields> f = new List<QuestionClass.Tabelfields>(); 
       fadd.Add(model[i]); 
      } 
     } 

     return RedirectToAction("Question", new { email = email, model = fadd.ToList() }); 
    } 

Mi otra Acción Método

[HttpGet] 
    public ActionResult Question(string email,List<QuestionClass.Tabelfields> model) 
    { 
    } 

No estoy recibiendo los valores en modelo.

Respuesta

18

No se pueden pasar objetos complejos en urls al redireccionar.

Una posibilidad sería utilizar TempData:

TempData["list"] = fadd.ToList(); 
return RedirectToAction("Question", new { email = email}); 

y luego dentro de la acción Pregunta:

var model = TempData["list"] as List<QuestionClass.Tablefields>; 
+0

En realidad, necesito una identificación de correo electrónico y modelo en Url. ¿cómo puedo obtenerlo? –

1

RedirectToAction método devuelve una respuesta HTTP 302 para el navegador, lo que hace que el navegador para hacer a OBTENER solicitud a la acción especificada.

Debe conservar los datos en un almacenamiento temporal como TempData/Session. TempData usa Session como almacenamiento de respaldo.

Si desea mantenerlo como apátrida real, debe pasar una identificación en la cadena de consulta y buscar la lista de elementos en su acción GET. Verdaderamente sin estado.

return RedirectToAction("Question", new { email = email,id=model.ID }); 

y en su método GET

public ActionResult Question(string email,int id) 
{ 

    List<QuestionClass.Tabelfields> fadd=repositary.GetTabelFieldsFromID(id); 
    //Do whatever with this 
    return View(); 
} 

Suponiendo repositary.GetTabelFieldsFromID devuelve una lista de TabelFields del Id

+0

¿Hay alguna opción para este return RedirectToAction ("Pregunta", nuevo {email = email, modelo = fadd.ToList()}); No recibí lo que quería de su respuesta. Quiero pasar el correo electrónico y la lista. gracias –

+1

@Ajay: Como te dije, es una redirección (una nueva solicitud HTTP, no puedes pasar un objeto tan complejo como está). debe probar cualquiera de los enfoques anteriores (almacenamiento temporal/Requery). Recuerde que HTTP es sin estado. – Shyju

4

Esto no es probablemente aún más activa, pero voy a dejar como lo hice aquí para tal vez ayudar a alguien más.

He resuelto esto usando una redirección sencilla en lugar de una RedirectToAction:

List<int> myList = myListofItems; 
var list = HttpUtility.ParseQueryString(""); 
myList.ForEach(x => list.Add("parameterList", x.ToString())); 
return Redirect("/MyPath?" + list); 

Luego, en el otro método:

public ActionResult Action(List<int> parameterList){} 
0

La forma en que he solucionado este problema era para serializar la lista para un objeto JSON que utiliza el método JsonConvert del paquete nuget Newtonsoft.Json. Luego, la lista serializada se puede pasar como parámetro y luego deserializar nuevamente para volver a crear la lista original.

Así que en su método SelectQuestion que usaría este código:

return RedirectToAction("Question", 
    new { 
     email = email, 
     serializedModel = JsonConvert.SerializeObject(fadd.ToList()) 
    }); 

Y en su método de interrogación, se utiliza este código para deserializar el objeto.

[HttpGet] 
public ActionResult Question(string email, string serializedModel) 
{ 
    // Deserialize your model back to a list again here. 
    List<QuestionClass.Tabelfields> model = JsonConvert.DeserializeObject<List<QuestionClass.Tabelfields>>(serializedModel); 
} 
Cuestiones relacionadas