2012-02-03 5 views
6

У меня есть настройки Knockoutjs динамически создать редактируемый список значений, используя следующий код:Как получить ModelState.AddModel Ошибка привязки к динамически созданным диапазонам проверки нокаута?

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

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

Я подключил проверку динамических данных с использованием кода рекомендуется на stackoverflow ,

Когда я отправляю обратно на сервер (я не использую JSON только сообщение формы), я могу выполнить более сложную проверку, и если что-то не получается, я могу использовать ModelState.AddModelError («имя входного поля», «Мне жаль дурака это сломало это »); Это отлично работает либо с сильным типом, либо с @ Html.ValidationMessage («имя входного поля») для нединамических полей.

Однако я не могу найти способ перехвата серверной модели. Ошибка в динамическом контенте.

У меня есть теги span, которые работают с клиентской стороной, и они отлично работают. Однако они не попадают в данные, возвращенные после проверки на стороне сервера, и возвращают страницу. Любая идея, как добиться этого?

Благодаря

+0

Предпочтительный подход заключается в создании пользовательского ModelBinder для привязки входящих значений к вашей модели и возможности запуска механизма проверки по умолчанию. Вы имеете в виду, что ваши модели создаются на стороне клиента, и вы не указали их на сервере? – Aliostad

+0

Модель определена на стороне сервера. В разделе страницы используется knockoutjs для добавления элементов в список. Я получаю все обратно через почту. Все динамические данные опубликованы. Проблема заключается в том, что я поднимаю серверную страницу с ошибкой (например, комплексную проверку), а затем возвращаюсь в представление, любые ошибки, возникающие в отношении динамически создаваемых элементов, не связаны. – GraemeMiller

+0

Я думаю, что мне, вероятно, придется получить доступ к modelstate и добавить соответствующие ошибки к модели Knockout, а затем использовать это. Просто задавался вопросом, был ли более элегантный способ (например, как я получил подтверждение на стороне клиента). – GraemeMiller

ответ

4

Я только что закончила кодирование это для моего текущего проекта работы. Я не могу опубликовать код для правил умиротворения. Как и ваш комментарий выше, нет элегантного способа. Я расскажу о шагах, которые мы предприняли для отображения наших сообщений об ошибках.

Сначала измените свой динамически сгенерированный html, чтобы каждый из них имел эквивалентный код для управления MVC3 @ Html.ValidationFor (...). Затем для каждого динамического элемента управления необходимо иметь поле id, которое вы можете использовать, чтобы найти элемент управления для добавления сообщения об ошибке.

шагов я взял были, начиная после того, как контроллер принимает Аякс данных для проверки -

  1. Validate принимаемых модели данных

  2. Создать класс для возврата результатов, которые выглядят как этот

    Class AjaxResults{ 
        bool success {get; set;); 
        object returnedData {get; set;); 
    } 
    
  3. Если модель подтверждает, верните AjaxResults с success = true и returnedData = «утверждена модель данных»

  4. Если модели не проверяет то

  5. Соберите все ошибки в список пар. Где key = fieldID и value = "сообщение об ошибке".
  6. возвращение AjaxResults с success = ложным и returnedData = "список ошибок"

  7. После клиент получает AjaxResults объект

  8. Если success = результат верно, то процесс нормально.

  9. Если success = false, пронумеруйте список, выделив поля с ошибкой и показывая сообщение об ошибке.

На последнем шаге вы можете использовать сообщение проверки jquery, отображающее код ошибки. Если вы хотите это сделать, то в jquery.unobtrusive.valiation.js файл

  1. Добавить код, чтобы дублировать функции метода onError в файле.
  2. Добавьте код для просмотра через список ошибок, вызывающий метод onError для отображения сообщений. Будьте осторожны, если эта информация хранится в атрибуте .data диапазона сообщений об ошибках.
  3. Возможно, вам потребуется написать код для устранения всех этих ошибок при отправке формы.

Это довольно длительная процедура. Но код легко модулируется в вызываемые подпрограммы. В настоящее время мы используем это в нашем производственном коде, и на практике он становится частью нашего кода инфраструктуры.

Надеюсь, что это поможет.

+0

Спасибо за отличный ответ. Я буду смотреть на это так. Жаль, что он менее элегантный! Я хочу, чтобы все валидации и динамические данные играли вместе немного лучше. – GraemeMiller

+0

Я просто наткнулся на это сообщение, которое, похоже, предоставляет одно из лучших решений для подключения к серверной стороне mvc-проверки для нокаутов. Я хотел бы следить за этой темой и посмотреть, хорошо ли это сработало для вас, @GraemeMiller, или если у вас были проблемы. Если это сработает, мне интересно, можете ли вы опубликовать несколько примеров кода для этого. – Dmitry

+0

На первый взгляд, я думаю, что [это] (http://bojankaurin.github.io/knockout-server-side-validation/) выполняет что-то вроде описанного в приведенном выше ответе. – bvgheluwe