2012-08-24 5 views
10

Ich möchte mehr als einen Parameter von RedirectToAction-Methode übergebenWie führe ich Liste in Redirecttoaction

Wie kann ich übergeben?

My One Aktion Methode

[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() }); 
    } 

Meine andere Aktion Methode

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

Ich bin nicht Werte in Modell bekommen.

Antwort

18

Sie können komplexe Objekte in URLs beim Umleiten nicht übergeben.

Eine Möglichkeit wäre TempData zu verwenden:

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

und dann in der Frage Aktion:

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

Eigentlich brauche ich E-Mail-ID und Modell in Url. wie kann ich es bekommen? –

1

RedirectToAction Methode Gibt eine HTTP-302-Antwort an den Browser, die den Browser verursacht zu machen a GET Anfrage an die angegebene Aktion.

Sie sollten die Daten entweder in einem temporären Speicher wie TempData/Session aufbewahren. TempData verwendet Session als Sicherungsspeicher.

Wenn Sie es wirklich zustandslos halten möchten, sollten Sie eine ID in der Abfragezeichenfolge übergeben und die Liste der Elemente in Ihrer GET Aktion abrufen. Wirklich Staatenlos.

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

und in Ihrer GET-Methode

public ActionResult Question(string email,int id) 
{ 

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

repositary.GetTabelFieldsFromID gibt eine Liste von TabelFields von der Id Unter der Annahme

+0

Gibt es eine Option für diese Rückkehr RedirectToAction ("Frage", neue {email = email, model = fadd.ToList()}); Ich habe nicht bekommen, was ich von Ihrer Antwort will. Ich möchte E-Mail und Liste übergeben. danke –

+1

@Ajay: Wie ich Ihnen gesagt habe, ist es eine Umleitung (eine neue HTTP-Anfrage, können Sie nicht so ein komplexes Objekt übergeben, wie es ist). Sie müssen einen der oben genannten Ansätze versuchen (temporärer Speicher/Requery). Denken Sie daran, HTTP ist zustandslos. – Shyju

4

Dies ist wahrscheinlich nicht einmal mehr aktiv, aber ich werde gehen, wie ich es tat hier um vielleicht jemand anderem zu helfen.

Ich löste dies einen einfachen Redirect statt eines RedirectToAction mit:

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

Dann auf andere Methode:

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

Die Art und Weise, dass ich dieses Problem gelöst war die Liste zu serialisiert ein JSON-Objekt, das die JsonConvert-Methode aus dem nuget-Paket Newtonsoft.Json verwendet. Dann kann die serialisierte Liste als Parameter übergeben und dann erneut deserialisiert werden, um die ursprüngliche Liste neu zu erstellen. Also in Ihrer SelectQuestion Methode

würden Sie diesen Code verwenden:

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

Und in Ihrer Frage Methode, würden Sie diesen Code verwenden, das Objekt deserialisieren.

[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); 
} 
Verwandte Themen