2009-01-04 39 views
6

Tôi có một bộ điều khiển với hai hành động:ASP.NET MVC Mẫu repopulation

[AcceptVerbs("GET")] 
    public ActionResult Add() 
    { 
     PrepareViewDataForAddAction(); 
     return View(); 
    } 


[AcceptVerbs("POST")] 
    public ActionResult Add([GigBinderAttribute]Gig gig, FormCollection formCollection) 
    { 
     if (ViewData.ModelState.IsValid) 
     { 
      GigManager.Save(gig); 
      return RedirectToAction("Index", gig.ID); 
     } 
     PrepareViewDataForAddAction(); 
     return View(gig); 
    } 

Như bạn có thể thấy, khi viết dưới dạng dữ liệu của nó, Add hành động sử dụng một GigBinder (An implemenation của IModelBinder)

Trong chất kết dính này tôi có:

if (int.TryParse(bindingContext.HttpContext.Request.Form["StartDate.Hour"], out hour)) 
     { 
      gig.StartDate.Hour = hour; 
     } 
     else 
     { 
      bindingContext.ModelState.AddModelError("Doors", "You need to tell us when the doors open"); 
     } 

Mẫu đơn này có một hộp văn bản với id "StartDate.Hour".

Như bạn có thể thấy ở trên, các kiểm tra GigBinder để thấy rằng người dùng đã nhập vào một số nguyên vào hộp văn bản có id "StartDate.Hour". Nếu không, lỗi mô hình sẽ được thêm vào mô hình bằng cách sử dụng AddModelError.

Vì tài sản biểu diễn gigs.StartDate.Hour được nhập mạnh, tôi không thể đặt giá trị của nó thành, ví dụ: "TEST" nếu người dùng đã nhập điều này vào hộp văn bản biểu mẫu.

Do đó, tôi không thể đặt giá trị của biểu diễn.StartDate.Hãy vì người dùng đã nhập chuỗi thay vì số nguyên.

Vì hành động thêm trả về chế độ xem và chuyển mô hình (trả về dạng xem (gig);) nếu mô hình không hợp lệ, khi biểu mẫu được hiển thị lại với xác thực mssages, giá trị "TEST" không được hiển thị trong hộp văn bản. Thay vào đó, nó sẽ là giá trị mặc định của gig.StartDate.Hour.

Làm cách nào để giải quyết vấn đề này? Tôi thực sự bị mắc kẹt!

Trả lời

1

bạn có thể làm điều này trong phương pháp PrepareViewDataForAddAction của bạn? ..

if (!ViewData.ModelState.IsValid) 
    { 
     ViewData["StartDate.Hour"] = "Error"; 
    } 

Các lĩnh vực khác về hình thức vẫn sẽ cư dựa trên các thuộc tính của đối tượng Gig.

1

Tôi nghĩ bạn cần thực hiện một số xác thực phía máy khách cơ bản trước. không cho phép đăng bài lên máy chủ.

2

Tôi nghĩ vấn đề là ViewModel của bạn không khớp đủ với Chế độ xem của bạn. Nó thực sự quan trọng trong MVC mà ViewModel của bạn khớp với View của bạn càng chặt chẽ càng tốt.

Trong ViewModel bạn đang giả định một số nguyên, nhưng trong dạng xem của bạn, bạn đang sử dụng một hộp văn bản để hiển thị thuộc tính, cho phép bất kỳ loại văn bản nào. Có một sự không phù hợp ở đây và những khó khăn mà bạn đang gặp phải khi cố gắng lập bản đồ chúng là một triệu chứng của sự không phù hợp.

Tôi nghĩ bạn nên một trong hai:
1. Thay đổi loại tài sản ViewModel để chuỗi và sau đó làm xác nhận trong điều khiển của bạn để đảm bảo chuỗi ký thực sự là một con số hay:
2. Thay đổi kiểm soát mà các Xem hiển thị cho điều khiển sẽ chỉ cho phép nhập số thông qua điều khiển tùy chỉnh hoặc xác thực Javascript (như @Qun Wang đề xuất)

Cá nhân, tôi khuyên bạn nên chọn tùy chọn 1. Cách này ViewModel không phụ thuộc vào Xem triển khai.

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