2010-01-10 5 views
5

thiết lập của tôi:Có nên sử dụng RenderAction với biểu mẫu không?

  • Có một cái nhìn cho một tuyến đường như: /Pages/Details/2
  • Các chi tiết trang xem có <% Html.RenderAction("CreatePageComment", "Comments"); %> để render một hình thức bình luận
  • bài viết dạng Comment để Comments/CreatePageComment
  • /Comments/CreatePageComment lợi nhuận RedirectToAction khi một nhận xét được tạo thành công
  • Điều này tất cả hoạt động độc đáo

Câu hỏi của tôi:

Nếu có một lỗi xác nhận, làm thế nào tôi nên trở về /Pages/Detail/1 và hiển thị các lỗi trong các hình thức bình luận?

  • Nếu tôi sử dụng RedirectToAction, có vẻ như việc xác thực là khó khăn; tôi có nên sử dụng mẫu Post-Redirect-Get để xác nhận lỗi không, thay vì chỉ trả lại?
  • Nếu tôi trả lại View(), nó sẽ đưa tôi trở lại hiển thị chế độ xem CreateComment.aspx (có xác thực, nhưng chỉ là biểu mẫu trên trang trắng), chứ không phải là /Pages/Details/2 tuyến đường được gọi là RenderAction.

Nếu sử dụng mẫu PRG, thì tôi chỉ cần tìm hiểu cách thực hiện xác thực trong khi sử dụng PRG. Nếu không phải là — và với tôi điều này có vẻ được xử lý tốt hơn bằng cách trả lại View() — thì tôi không biết cách đưa người dùng quay lại chế độ xem ban đầu, hiển thị lỗi biểu mẫu, trong khi sử dụng RenderAction.

Điều này giống như trò chơi mà bạn chạm vào đầu và chà xát bụng cùng một lúc. Tôi cũng không giỏi điều đó. Tôi mới ở MVC, vì vậy đó có thể là vấn đề ở đây.

+0

BTW: Tôi có thể thực hiện điều này bằng cách chỉ có một phần và tuyến đường POST/Trang/Tạo lời bình, nhưng điều đó có vẻ lộn xộn không? Tôi muốn có ý kiến ​​của tôi điều khiển xử lý ý kiến, không phải là bộ điều khiển trang. Thật kỳ lạ, tôi chỉ xem xét mã công cụ blog Oxite và Trình điều khiển bài đăng của họ xử lý việc thêm Nhận xét; Bộ điều khiển nhận xét của họ thậm chí không có tác vụ Tạo! –

Trả lời

5

Tôi tin rằng câu trả lời là sử dụng TempData, ví dụ:

Theo quan điểm của tôi (/ bước/Details) Tôi có:

<!-- List comments --> 
<% Html.RenderAction("List", "Comments", new { id = Model.Step.Id }); %> 

<!-- Create new comment --> 
<% Html.RenderAction("Create", "Comments", new { id = Model.Step.Id }); %> 

Trong điều khiển bình luận của tôi, tôi có phương thức POST của tôi:

// POST: /Comments/Create 
    [HttpPost] 
    public ActionResult Create([Bind(Exclude = "Id, Timestamp, ByUserId, ForUserId")]Comment commentToCreate) 
    { 
     if (ModelState.IsValid) 
     { 
      //Insert functionality here 

      return RedirectToAction("Details", "Steps", new { id = commentToCreate.StepId }); 

     } 

    //If validation error 
     else 
     { 

      //Store modelstate from tempdata 
      TempData.Add("ModelState", ModelState); 

      //Redirect to action (this is hardcoded for now) 
      return RedirectToAction("Details", "Steps", new { id = commentToCreate.StepId }); 
     } 
    } 

Cũng trong bộ điều khiển bình luận là phương thức GET của tôi:

// 
    // GET: /Comments/Create 

    public ActionResult Create(int id) 
    { 

     if (TempData.ContainsKey("ModelState")) 
     { 
      ModelStateDictionary externalModelState = (ModelStateDictionary)TempData["ModelState"]; 
      foreach (KeyValuePair<string, ModelState> valuePair in externalModelState) 
      { 
       ModelState.Add(valuePair.Key, valuePair.Value); 
      } 
     } 
     return View(new Comment { StepId = id }); 
    } 

Điều này phù hợp với tôi, nhưng tôi đánh giá cao phản hồi về việc đây có phải là phương pháp hay hay không, v.v.

Ngoài ra, tôi nhận thấy rằng MvcContrib có trang trí ModelStateToTempData, nhưng theo cách gọn gàng hơn . Tôi sẽ cố gắng tiếp theo.

+0

Tôi gặp vấn đề tương tự về những gì bạn có. Giải pháp bạn đề xuất có vẻ hiệu quả, nhưng tôi tò mò nếu không có cách nào làm sạch hơn. Đối với tôi, giải pháp của bạn dường như là một hack hơn là một giải pháp thực sự. Tôi không biết liệu có ai khác có ý kiến ​​gì về điều này không? – Melursus

+0

Vâng, nó cảm thấy bị tấn công, nhưng đây là tất cả những gì tôi có thể tìm thấy. Giống như bạn, tôi muốn chào đón một giải pháp sạch hơn. –

+0

Trong nghiên cứu của tôi, tôi thấy rằng thư viện MvcContrib có một cái gì đó gọi là SubController mà có thể có thể giải quyết loại vấn đề đó. Tôi không nhìn xa hơn, nhưng nó có vẻ thú vị. – Melursus