2012-02-03 14 views
6

Tôi có Knockoutjs thiết lập để tự động tạo ra một danh sách có thể chỉnh sửa các giá trị sử dụng đoạn mã sau:Làm cách nào để tôi gặp lỗi ModelState.AddModel để liên kết với việc loại bỏ xác thực được tạo tự động?

 var requirementModel = function() { 
     var self = this; 
     self.requirementtypes = ko.observableArray(@Html.Interpret(Model.requirementtypes)); 
     self.requirementid = ko.observable(@Html.Interpret(Model.requirementid)); 
     self.AddRequirementType = function() { 
      self.requirementtypes.push({ 
       requirementtypeid: null, 
       number: "", 
       requirementid: 0 
      }); 
     }; 
     self.RemoveType = function(Type) { 
      self.requirementtypes.remove(Type); 
     }; 
     self.hookUpValidation = function() { 
      $.validator.unobtrusive.parseDynamicContent('.dynamicData'); 
     }; 
    }; 
    var viewModel = new requirementModel(); 
    ko.applyBindings(viewModel); 

Với html:

<div class="small-box dynamicData" data-bind="template:{ name: 'requirementType-template', foreach: requirementtypes, afterRender:$root.hookUpValidation }" ></div> 
<button data-bind='click: AddType'>Add Type</button> 

Tôi đã nối xác nhận cho dữ liệu động sử dụng mã khuyến cáo trên stackoverflow .

Khi tôi gửi lại cho máy chủ (tôi không sử dụng JSON chỉ tạo bưu điện) tôi có thể làm xác nhận phức tạp hơn và nếu có điều gì không Tôi có thể sử dụng ModelState.AddModelError ("tên trường đầu vào", "Tôi thương hại những kẻ ngốc đã phá vỡ điều này "); Điều này hoạt động hoàn hảo với một trong hai loại mạnh mẽ hoặc @ Html.ValidationMessage ("tên trường đầu vào") cho các trường không động

Tuy nhiên tôi không thể tìm cách móc Lỗi máy chủ bên mô hình động với nội dung động.

Tôi có thẻ span hoạt động với phía máy khách và chúng hoạt động hoàn hảo. Tuy nhiên, chúng không được nối vào dữ liệu được trả về sau khi xác thực serverside không thành công và trả về trang. Bất kỳ ý tưởng làm thế nào để đạt được điều này?

Cảm ơn

+0

Cách tiếp cận ưa thích là xây dựng một ModelBinder tùy chỉnh để liên kết các giá trị đến với mô hình của bạn và để cơ chế xác thực mặc định khởi động. Bạn có nghĩa là mô hình của bạn được tạo ra trên phía máy khách và bạn không có nó được xác định trên máy chủ? – Aliostad

+0

Mô hình được xác định ở phía máy chủ. Một phần của trang sử dụng knockoutjs để thêm các mục vào danh sách. Tôi nhận được tất cả mọi thứ trở lại hoàn hảo thông qua bài viết. Tất cả dữ liệu động đều được đăng. Vấn đề là nếu tôi nâng lên phía máy chủ lỗi (ví dụ: xác thực phức tạp) và sau đó quay lại chế độ xem, bất kỳ lỗi nào được nêu ra đối với các mục được tạo động không bị ràng buộc. – GraemeMiller

+0

Tôi nghĩ rằng tôi có thể sẽ phải truy cập vào mô hình và thêm các lỗi thích hợp vào mô hình Knockout và sau đó sử dụng nó. Chỉ cần tự hỏi nếu có một cách thanh lịch hơn (như thế nào tôi đã xác nhận phía khách hàng) – GraemeMiller

Trả lời

4

Tôi vừa mới hoàn thành mã hóa này cho dự án công việc hiện tại của tôi. Tôi không thể đăng mã cho các quy tắc bắt buộc. Giống như bình luận của bạn ở trên nói, không có một cách thanh lịch. Tôi sẽ mô tả các bước mà chúng tôi đã thực hiện để hiển thị thông báo lỗi của chúng tôi.

Trước tiên, hãy sửa đổi html được tạo động của bạn để mỗi mã có mã tương đương với điều khiển MVC3 @ Html.ValidationFor (...). Tiếp theo, mỗi điều khiển động cần có một trường id mà bạn có thể sử dụng để định vị điều khiển để thêm thông báo lỗi vào.

bước tôi đã lấy được, bắt đầu từ sau khi bộ điều khiển nhận dữ liệu ajax để xác nhận -

  1. Validate nhận được mô hình dữ liệu

  2. Tạo một lớp học để trả lại kết quả giống như

    này
    Class AjaxResults{ 
        bool success {get; set;); 
        object returnedData {get; set;); 
    } 
    
  3. Nếu mô hình xác thực, hãy trả lại AjaxResults với success = true và returnedData = "mô hình dữ liệu xác nhận"

  4. Nếu mô hình không xác nhận sau đó

  5. Thu thập tất cả các lỗi vào một danh sách các cặp. Trường hợp key = fieldID và value = "thông báo lỗi".
  6. trở AjaxResults với success = false và returnedData = "danh sách các lỗi"

  7. Sau khi khách hàng nhận được đối tượng AjaxResults

  8. Nếu success = kết quả đúng, quá trình bình thường.

  9. Nếu success = false, hãy lặp qua danh sách làm nổi bật các trường có lỗi và hiển thị thông báo lỗi.

Trong bước cuối cùng, bạn có thể sử dụng thông báo xác thực jquery hiển thị mã lỗi. Nếu bạn muốn làm điều này, thì trong tệp jquery.unobtrusive.valiation.js

  1. Thêm mã để nhân đôi chức năng của phương pháp onError trong tệp.
  2. Thêm mã để tương tác thông qua danh sách lỗi gọi phương thức onError của bạn để hiển thị thông báo. Hãy cẩn thận ở đây trong thông tin đó được lưu trữ trong thuộc tính .data của khoảng thông báo lỗi.
  3. Bạn có thể cần phải viết mã để xóa tất cả các lỗi này khi gửi biểu mẫu.

Đây là một quy trình khá dài. Nhưng mã này dễ dàng được mô đun hóa thành các thường trình có thể gọi được. Chúng tôi hiện đang sử dụng mã này trong mã sản xuất của mình và trong thực tế, nó trở thành một phần của mã khuôn khổ của chúng tôi.

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn câu trả lời tuyệt vời. Tôi sẽ xem xét việc đó theo cách đó. Đáng tiếc nó là ít hơn thanh lịch! Tôi muốn tất cả các dữ liệu xác thực và năng động chơi với nhau một chút đẹp hơn. – GraemeMiller

+0

Tôi chỉ tình cờ gặp bài đăng này, mà nó có vẻ như cung cấp một trong những giải pháp tốt hơn cho hooking lên xác thực phía máy chủ mvc để knockoutjs. Tôi muốn theo dõi chủ đề này và xem điều này có hiệu quả với bạn hay không, @GraemeMiller tốt hay nếu bạn gặp khó khăn. Nếu nó hoạt động tốt, tôi tự hỏi nếu bạn có thể đăng thêm một chút các ví dụ mã cho việc này. – Dmitry

+0

Ngay từ cái nhìn đầu tiên, tôi nghĩ [this] (http://bojankaurin.github.io/knockout-server-side-validation/) hoàn thành một cái gì đó như mô tả trong câu trả lời ở trên. – bvgheluwe

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