Как получить Ошибка ModelState.AddModel для привязки к нокауту динамически созданных диапазонов проверки? - PullRequest
6 голосов
/ 03 февраля 2012

Я настроил Knockoutjs для динамического создания редактируемого списка значений, используя следующий код:

       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, которые работают на стороне клиента и работают отлично. Однако они не попадают в данные, возвращаемые после сбоя проверки на стороне сервера и возврата страницы. Есть идеи, как этого добиться?

Спасибо

1 Ответ

4 голосов
/ 05 февраля 2012

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

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

Шаги, которые я предпринял, начинались после того, как контроллер получил данные ajax для проверки -

  1. Проверка полученной модели данных

  2. Создайте класс для возврата результатов, которые выглядят следующим образом

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

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

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

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

  8. Если success = true, обработайте результат нормально.

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

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

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

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

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

...