2016-12-08 13 views
5

Tôi đã viết một ứng dụng sử dụng khung ASP.NET MVC 5. Tôi đang sử dụng một cách ràng buộc hai chiều giữa các khung nhìn và ViewModels.Làm thế nào tôi có thể tự kết nối dữ liệu từ một ModelStateDictionary với một mô hình trình diễn với ASP.NET MVC?

Vì tôi đang sử dụng liên kết hai chiều, tôi nhận được lợi ích của xác thực phía máy khách và phía máy chủ. Tuy nhiên, khi tôi gửi yêu cầu POST tới máy chủ và trình xử lý yêu cầu ném ngoại lệ, tôi muốn chuyển hướng người dùng đến phương thức GET.

Khi chuyển hướng xảy ra, tôi muốn lưu trạng thái mô hình sao cho trang trông giống nhau khi tôi hiển thị lỗi. Tôi có thể lưu mô hình trạng thái và các lỗi bằng cách sử dụng ActionFiltersTempDatavia this approach. Tuy nhiên, khi yêu cầu được chuyển hướng, từ POST đến GET trạng thái mô hình được lưu dưới dạng đối tượng System.Web.Mvc.ModelStateDictionary là cặp khóa/giá trị với tất cả đầu vào của người dùng đến từ yêu cầu POST.

Để hiển thị trang chính xác cho người dùng cuối, tôi cần phải liên kết dữ liệu trong System.Web.Mvc.ModelStateDictionary với mô hình bản trình bày của riêng tôi.

Làm cách nào để gắn đối tượng System.Web.Mvc.ModelStateDictionary vào đối tượng trình bày của tôi?

Sau đây là cách mã của tôi trông giống như

[ImportModelStateFromTempData] 
public ActionResult show(int id) 
{ 

    var prsenter = new UserProfileDetailsPresenter(id); 

    ModelStateDictionary tmp = TempData["Support.ModelStateTempDataTransfer"]; 

    if(tmp != null) 
    { 
     // Some how map tmp to prsenter 
    } 

    return View(prsenter); 

} 

[HttpPost] 
[ValidateAntiForgeryToken] 
[ExportModelStateToTempData] 
public ActionResult Update(int id, DetailsPresenter model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      var updater = new UpdateAddressServiceProvider(CurrentUser); 

      updater.Handle(model.General); 
     } 

    } 
    catch (Exception exception) 
    { 
     ModelState.AddModelError("error", exception.Message); 
    } finally 
    { 
     return new RedirectResult(Url.Action("Show", new { Id = id }) + "#General"); 
    } 
} 

Trả lời

4

Nếu có một lỗi, không chuyển hướng, chỉ cần trả lại View.

[HttpPost] 
[ValidateAntiForgeryToken] 
[ExportModelStateToTempData] 
public ActionResult Update(int id, DetailsPresenter model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      var updater = new UpdateAddressServiceProvider(CurrentUser); 

      updater.Handle(model.General); 
     } 

     return new RedirectResult(Url.Action("Show", new { Id = id }) + "#General"); 
    } 
    catch (Exception exception) 
    { 
     ModelState.AddModelError("error", exception.Message); 

     // Return the named view directly, and pass in the model as it stands. 
     return View("Show", model); 
    } 
} 
+0

Chế độ xem "Hiển thị" đang chờ 'đối tượng UserProfileDetailsPresenter' không phải là' DetailsPresenter'. Thay vì phải tạo 'UserProfileDetailsPresenter' trong mọi yêu cầu, tôi thay vì chuyển hướng đến hành động' Index' và để nó tạo ra đối tượng đúng và chỉ ràng buộc dữ liệu. – Jaylen

+0

Bạn đặt cược tốt nhất là bạn thực hiện cuộc gọi đó ở cả hai nơi (kudo cho đã có nó trong một phương pháp). Bạn sẽ tạo ra 'UserProfileDetailsPresenter' mỗi lần bất kể. Đây là cách chính xác để làm điều đó trong MVC. Bạn không muốn đưa dữ liệu không chính xác, không đúng định dạng hoặc thậm chí nguy hiểm vào cơ sở dữ liệu của mình. – krillgar

+0

Vì vậy, trong trường hợp đó không cần ExportModelStateToTempData, phải không? lợi ích của việc có nó là gì? – Jaylen

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