2012-02-03 7 views
6

mam Knockoutjs konfiguracji dynamicznie utworzyć edytowalną listę wartości, stosując następujący kod:Jak uzyskać błąd ModelState.AddModel wiązania do nokautu dynamicznie utworzone zakresy sprawdzania poprawności?

 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); 

Z 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> 

mam podłączony walidacji dla dynamicznych danych przy użyciu kodu zalecana na stackoverflow .

Kiedy wysyłam z powrotem na serwer (nie używam JSON-a do wysłania formularza) mogę wykonać bardziej złożoną weryfikację i jeśli coś się nie powiedzie, mogę użyć ModelState.AddModelError ("nazwa pola wejściowego", "szkoda mi głupca który to złamał "); Działa to doskonale albo z silnym typem, albo z atrybutem @ Html.ValidationMessage ("nazwa pola wejściowego") dla niedynamicznych pól.

Jednak nie mogę znaleźć sposobu na zwrócenie błędu modelu strony po stronie serwera dla zawartości dynamicznej.

Mam tagi span, które działają po stronie klienta i działają idealnie. Jednak nie są one uzależnione od danych zwracanych po niepowodzeniu sprawdzania poprawności serwera i zwróceniu strony. Masz pomysł, jak to osiągnąć?

Dzięki

+0

Preferowanym podejściem jest zbudowanie niestandardowego elementu ModelBinder w celu powiązania przychodzących wartości z modelem i zezwolenie na uruchomienie domyślnego mechanizmu sprawdzania poprawności. Masz na myśli, że twoje modele są generowane po stronie klienta, a ty nie masz go zdefiniowanego na serwerze? – Aliostad

+0

Model jest zdefiniowany po stronie serwera. Sekcja strony używa knockoutjs do dodawania elementów do listy. Wszystko dostaję doskonale pocztą. Wszystkie dane dynamiczne są publikowane. Problem polega na tym, że jeśli podniosę stronę serwera błędów (na przykład złożoną weryfikację), a następnie powrócę do widoku, wszelkie błędy wywołane w stosunku do elementów tworzonych dynamicznie nie są powiązane. – GraemeMiller

+0

Myślę, że prawdopodobnie będę musiał uzyskać dostęp do stanu modelu i dodać odpowiednie błędy do modelu Knockout, a następnie użyć tego. Zastanawiałam się, czy istnieje bardziej elegancki sposób (jak na przykład sprawdzanie poprawności strony klienta). – GraemeMiller

Odpowiedz

4

Właśnie zakończyłem kodowanie tego dla mojego obecnego projektu pracy. Nie mogę zaksięgować kodu dla zasad przebłagania. Zgodnie z powyższym komentarzem nie ma eleganckiej metody. Opiszę kroki, które podjęliśmy, aby wyświetlić nasze komunikaty o błędach.

Najpierw zmodyfikuj swój generowany dynamicznie html, aby każdy miał kod równoważny z formantem MVC3 @ Html.ValidationFor (...). Następnie każde dynamiczne sterowanie musi mieć pole identyfikatora, za pomocą którego można zlokalizować kontrolę, aby dodać komunikat o błędzie.

kroki wziąłem były zaczynając po sterownik odbiera dane AJAX dla sprawdzania poprawności -

  1. Sprawdź poprawność odebranego model danych

  2. Utwórz klasę wrócić wyniki, które wygląda tak

    Class AjaxResults{ 
        bool success {get; set;); 
        object returnedData {get; set;); 
    } 
    
  3. Jeśli model sprawdzi, zwróć AjaxResults z success = true i returnedData = „zatwierdzony model danych”

  4. Jeśli modele nie sprawdza następnie

  5. Zbierz wszystkie błędy na listę par. Gdzie klucz = fieldID i value = "komunikat o błędzie".
  6. powrót AjaxResults z success = false i returnedData = "Lista błędów"

  7. Po klient otrzymuje obiektowi AjaxResults

  8. Jeśli success = wynik prawda, proces normalnie.

  9. Jeśli success = false, następuje iteracja po liście, podświetlając pola z błędem i wyświetlając komunikat o błędzie.

W ostatnim kroku można użyć komunikatu sprawdzania poprawności jquery i wyświetlić kod błędu. Jeśli chcesz to zrobić, to w pliku jquery.unobtrusive.valiation.js

  1. Dodaj kod, aby powielić funkcjonalność metody onError w pliku.
  2. Dodaj kod do interakcji poprzez listę błędów wywołującą metodę onError, aby wyświetlić komunikaty. Uważaj tutaj, ponieważ informacje są przechowywane w atrybucie .data zakresu komunikatów o błędach.
  3. Może być konieczne napisanie kodu, aby usunąć wszystkie te błędy po przesłaniu formularza.

To dość długa procedura. Ale kod jest łatwo modularyzowany w rutyny. Obecnie używamy tego w naszym kodzie produkcyjnym iw praktyce staje się częścią naszego kodu ramowego.

Mam nadzieję, że to pomoże.

+0

Dzięki za wspaniałą odpowiedź. Spróbuję zrobić to w ten sposób. Szkoda, że ​​nie jest elegancka! Życzę wszystkim trochę lepszych danych walidacyjnych i dynamicznych. – GraemeMiller

+0

Po prostu natknąłem się na ten post, który wydaje się być jednym z lepszych rozwiązań do sprawdzania poprawności strony mvc na knockoutjs. Chciałbym odpowiedzieć na ten temat i sprawdzić, czy to zadziałało dla ciebie, @GraemeMiller, czy też miałeś kłopoty. Jeśli to działało dobrze, zastanawiam się, czy mógłbyś dodać trochę więcej przykładów kodu do tego. – Dmitry

+0

Na pierwszy rzut oka uważam, że [this] (http://bojankaurin.github.io/knockout-server-side-validation/) wykonuje coś podobnego do opisanego w powyższej odpowiedzi. – bvgheluwe

Powiązane problemy