2012-08-24 13 views
10

Tôi muốn chuyển nhiều hơn thì một tham số từ phương thức RedirectToActionCách chuyển Danh sách trong Redirecttoaction

làm cách nào tôi có thể vượt qua?

My One Action Method

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

khác Action Method My

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

tôi không nhận được giá trị trong mô hình.

Trả lời

18

Bạn không thể chuyển các đối tượng phức tạp trong các url khi chuyển hướng.

Một khả năng sẽ được sử dụng TempData:

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

và sau đó bên trong hành động Câu hỏi:

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

Thực ra tôi cần id email và mô hình trong Url. làm cách nào tôi có thể nhận được? –

1

RedirectToAction phương pháp Trả về một phản ứng HTTP 302 cho trình duyệt, mà làm cho trình duyệt để làm a NHẬN yêu cầu hành động được chỉ định.

Bạn nên giữ dữ liệu trong bộ nhớ tạm thời như TempData/Session. TempData sử dụng Phiên làm bộ nhớ sao lưu.

Nếu bạn muốn giữ cho nó là không có quốc tịch, bạn nên chuyển một id trong chuỗi truy vấn và tìm nạp danh sách các mục trong hành động GET của bạn. Thực sự không quốc tịch.

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

và trong phương thức GET của bạn

public ActionResult Question(string email,int id) 
{ 

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

Giả sử repositary.GetTabelFieldsFromID lợi nhuận một Danh sách TabelFields từ Id

+0

Có tùy chọn nào cho trả về RedirectToAction ("Câu hỏi", mới {email = email, model = fadd.ToList()}) hay không; Tôi không nhận được những gì tôi muốn từ câu trả lời của bạn. Tôi muốn chuyển Email và Danh sách. cảm ơn bạn –

+1

@Ajay: Như tôi đã nói với bạn, Đây là một chuyển hướng (một yêu cầu HTTP mới, bạn không thể vượt qua một đối tượng phức tạp như vậy). bạn cần thử bất kỳ phương pháp nào ở trên (lưu trữ tạm thời/Yêu cầu). Nhớ HTTP là không quốc tịch. – Shyju

4

Đây có lẽ thậm chí không hoạt động nữa, nhưng tôi sẽ để lại như thế nào tôi đã làm nó ở đây để có thể giúp đỡ người khác.

tôi giải quyết này bằng cách sử dụng Redirect đơn giản thay vì một RedirectToAction:

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

Sau đó, trên phương pháp khác của bạn:

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

Cách mà tôi giải quyết vấn đề này là để serialize danh sách để một đối tượng JSON bằng cách sử dụng phương thức JsonConvert từ gói nuget Newtonsoft.Json. Sau đó, danh sách được tuần tự hóa có thể được chuyển thành tham số và sau đó được deserialized lại để tạo lại danh sách gốc.

Vì vậy, trong phương pháp SelectQuestion của bạn, bạn sẽ sử dụng mã này:

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

Và trong phương pháp Câu hỏi của bạn, bạn sẽ sử dụng mã này để deserialize đối tượng.

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