2010-11-14 28 views
7

Tôi có một lớp viewmodel chứa một vài thuộc tính. Về cơ bản, bản ghi hiện tại (người dùng đang chỉnh sửa) và danh sách các tùy chọn (được sử dụng để điền danh sách thả xuống bằng DropDownListFor).MVC DropDownListFor - Tôi có phải điền lại các tùy chọn sau khi xác nhận không thành công không?

Sau khi biểu mẫu được gửi, nếu modelstate không hợp lệ, tôi quay lại chế độ xem. Tôi hiểu rằng biểu mẫu được điền bằng cách sử dụng đầu vào 'bị từ chối' từ ModelState["name"].Value.AttemptedValue, nhưng tôi không chắc chắn phải làm gì về danh sách giá trị cho danh sách thả xuống.

Nếu tôi không làm gì, khi xác thực không thành công và trở về trang, tôi nhận được tham chiếu 'đối tượng không được đặt thành lỗi của đối tượng' vì thuộc tính danh sách của mô hình chế độ xem là rỗng. Tôi biết rằng nó là null vì nó không bị ràng buộc từ bài đăng biểu mẫu, vì vậy tôi có thể repopulate nó từ cơ sở dữ liệu trước khi trở về xem.

Đó có phải là cách chính xác để thực hiện hay không, hoặc tôi thiếu một cách rõ ràng hơn để làm cho giá trị thả xuống vẫn tồn tại?

Trả lời

10

Vâng, đó là cách chính xác nếu bạn có ý định quay trở lại quan điểm tương tự trong hành động POST:

  1. bind danh sách trong hành động GET từ cơ sở dữ liệu
  2. render xem
  3. người dùng gửi biểu mẫu cho hành động POST
  4. trong hành động này bạn chỉ tìm nạp giá trị được chọn để mô hình không hợp lệ và bạn cần phải hiển thị lại chế độ xem bạn cần để lấy lại danh sách từ cơ sở dữ liệu.

Dưới đây là một ví dụ về một mô hình thường được sử dụng trong MVC:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Items = _repository.GetItems() 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      // Validation failed, fetch the list from the database 
      // and redisplay the form 
      model.Items = _repository.GetItems(); 
      return View(model); 
     } 
     // at this stage the model is valid => 
     // use the selected value from the dropdown 
     _repository.DoSomething(model.SelectedValue); 
     // You no longer need to fetch the list because 
     // we are redirecting here 
     return RedirectToAction("Success", "SomeOtherController"); 
    } 
} 
+0

Cảm ơn. Đó là khá nhiều kỹ thuật tôi đã sử dụng. Chỉ cần làm việc một mình trên một dự án bằng cách sử dụng một công nghệ mới, nó là tốt để kiểm tra chống lại một ý kiến ​​thứ hai! – Gavin

0

Bạn có thể sử dụng cuộc gọi XHR ajax để gửi dữ liệu của bạn, thay vì nộp mẫu đơn bởi nó mặc định nút gửi.

Lợi thế của kỹ thuật này là bạn sẽ không cần phải điền lại danh sách của mình.

Về phía khách hàng và sau khi cuộc gọi ajax lại bạn có thể quyết định làm những gì mà bạn muốn bằng cách kiểm tra trên giá trị status

$.ajax({ 
    url: '@Url.Action("Index", "Controller")', 
    data: $("#form").serialize(), 
    type: 'POST', 
    success: function (data) { 
     if (data.status == "Successful") { 
      // you can redirect to another page by window.location.replace('New URL') 
     } else { 
      // you can display validation message 
     } 
    } 
}); 

Bạn ActionMethod sẽ như thế nào:

[HttpPost] 
     public JsonResult Index() 
     { 
      if (ModelState.IsValid) 
      { 
       return Json(new { status = "Success" });  
      } 
      else 
      { 
       return Json(new { status = "Fail" }); 
      } 
     } 
Các vấn đề liên quan