2013-01-10 47 views
5

Tôi đang cố triển khai mẫu PRG bằng cách sử dụng các bộ lọc hành động [ImportModelStateFromTempData][ExportModelStateToTempData]. Mô hình này hoạt động tốt cho các mô hình phẳng nhưng tôi không thể làm cho nó hoạt động khi tôi có một bộ sưu tập con. Mô hình của tôi trông như thế này:Mẫu PRC MVC với trẻ em

public class QuestionModel 
{ 
    public string QuestionText { get; set; } 

    public ICollection<ChoiceModel> Choices { get; set; } 
} 

public class ChoiceModel 
{ 
    public string ChoiceText { get; set; } 
} 

điều khiển của tôi là như sau:

[HttpGet, ImportModelStateFromTempData] 
public ActionResult Create() 
{ 
    return View(); 
} 

[HttpPost, ExportModelStateToTempData] 
public ActionResult Create(QuestionModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     // not getting here 
    } 

    return RedirectToAction("Create"); 
} 

Quan điểm của tôi cho phép người dùng thêm các mục mới vào sự lựa chọn, và tôi có một xác nhận rằng sự lựa chọn phải là duy nhất. Khi ModelState của tôi không hợp lệ, nó sẽ đóng gói ModelState vào TempData và chuyển hướng đến hành động HttpGet. Tại thời điểm này tất cả các giá trị mô hình con của tôi là trong ModelState, nhưng nó không tái tạo chúng khi nó chuyển mô hình đến khung nhìn, do đó quan điểm của tôi cho thấy rằng có thêm 0 trẻ em.

Có cách nào bằng cách nào đó hợp nhất ModelState với Mô hình hoặc tôi không thể sử dụng mẫu này với các đối tượng con không?

Trả lời

1

tôi nghi ngờ [ImportModelStateFromTempData] sẽ tái tạo lại các mô hình từ ModelState, tôi chụp ảnh nó chỉ nhận các giá trị sử dụng cố gắng xác nhận lỗi, do đó, bộ sưu tập mô hình không được khởi tạo tại thời điểm này (GET) và bạn không chuyển bộ sưu tập từ POST, nó sẽ chỉ hiển thị trạng thái ban đầu của mô hình, đó là tại sao nó hoạt động tốt với các mô hình phẳng nhưng không hoạt động với các bộ sưu tập như trong trường hợp này.

Vì vậy, bạn phải tìm cách chuyển bộ sưu tập đó hoặc mô hình lỗ từ POST đến hành động GET và tùy chọn là TempData.

//POST - if validation fails 
TempData["model"] = model; 

//GET - must check if TempData["model"] is null first 
QuestionModel model = (QuestionModel)TempData["model"]; 
+0

Nếu âm thanh này quá lộn xộn, bạn cũng có thể thay đổi thành mẫu 'PRG Loose', nó sẽ dễ dàng hơn rất nhiều http://stackoverflow.com/questions/8178821/is-there-a-name-for-the-prg-pattern- xác thực-không-chuyển hướng-trên-thất bại? rq = 1 – JOBG

Các vấn đề liên quan