2012-02-03 15 views
6

que tienen Knockoutjs de configuración para crear dinámicamente una lista editable de valores utilizando el siguiente código:¿Cómo consigo que el error ModelState.AddModel se vincule con los espacios de validación creados dinámicamente?

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

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

he enganchado hasta la validación de datos dinámicos utilizando el código recomendado En stackoverflow .

Cuando publico de nuevo en el servidor (no estoy usando JSON solo en la publicación) puedo hacer una validación más compleja y si algo falla puedo usar ModelState.AddModelError ("input field name", "Lamento al tonto" eso rompió esto "); Esto funciona perfectamente con strong type o @ Html.ValidationMessage ("nombre de campo de entrada") para los campos no dinámicos

Sin embargo, no encuentro una forma de enganchar el Server Side Model Error al contenido dinámico.

Tengo las etiquetas span que funcionan con el lado del cliente y funcionan perfectamente. Sin embargo, no se están enganchando a los datos devueltos después de que la validación en el servidor falla y devuelve la página. ¿Alguna idea de cómo lograr esto?

Gracias

+0

El enfoque preferido es crear un ModelBinder personalizado para vincular los valores entrantes a su modelo y permitir que el mecanismo de validación predeterminado se active. ¿Quiere decir que sus modelos se generan en el lado del cliente y no lo tiene definido en el servidor? – Aliostad

+0

El modelo se define en el lado del servidor. Una sección de la página utiliza knockoutjs para agregar elementos a una lista. Estoy recuperando todo perfectamente a través de la publicación. Los datos dinámicos están todos publicados. El problema es si elevo un lado del servidor de errores (por ejemplo, validación compleja) y luego vuelvo a la vista, no se vinculan los errores generados con los elementos creados dinámicamente. – GraemeMiller

+0

Estoy pensando que probablemente tenga que acceder al modelo estatal y agregar los errores apropiados al modelo Knockout y luego usar eso. Sólo me preguntaba si había una manera más elegante (como la forma en que obtuve la validación del lado del cliente) – GraemeMiller

Respuesta

4

acabo de terminar la codificación de esto para mi proyecto de trabajo actual. No puedo publicar el código de reglas propiciatorias. Al igual que su comentario anterior dice, no hay una manera elegante. Describiré los pasos que tomamos para mostrar nuestros mensajes de error.

Primero, modifique su html generado dinámicamente para que cada uno tenga el código equivalente al control MVC3 @ Html.ValidationFor (...). A continuación, cada control dinámico debe tener un campo de Id. Que pueda usar para ubicar el control y agregar un mensaje de error.

pasos que di fueron, comenzando después de que el controlador recibe los datos de ajax para la validación -

  1. Validar el modelo de datos recibidos

  2. Crear una clase para devolver los resultados que tiene este aspecto

    Class AjaxResults{ 
        bool success {get; set;); 
        object returnedData {get; set;); 
    } 
    
  3. Si el modelo valida, devuelva AjaxResults con success = true y returnedData = "modelo de datos validada"

  4. Si los modelos no valida entonces

  5. recoger todos los errores en una lista de pares. Donde key = fieldID y value = "el mensaje de error".
  6. retorno AjaxResults con success = falso y returnedData = "lista de errores"

  7. Después cliente recibe el objeto AjaxResults

  8. Si success = verdadero resultado, proceso normalmente.

  9. Si success = falso, repita la lista resaltando los campos con el error y mostrando el mensaje de error.

En el último paso, puede usar el mensaje de validación de jquery para mostrar el código de error. Si desea hacer esto, en el archivo jquery.unobtrusive.valiation.js

  1. Agregue código para duplicar la funcionalidad del método onError en el archivo.
  2. Agregue código para interar a través de la lista de errores llamando a su método onError para mostrar los mensajes. Tenga cuidado aquí en que la información se almacena en el atributo .data del intervalo de mensajes de error.
  3. Es posible que deba escribir el código para borrar todos estos errores al enviar el formulario.

Este es un procedimiento bastante largo. Pero el código se puede modularizar fácilmente en rutinas invocables. Actualmente estamos usando esto en nuestro código de producción y, en la práctica, se convierte en parte de nuestro código de marco.

Espero que esto ayude.

+0

Gracias por la gran respuesta. Voy a buscar hacerlo de esa manera. Lástima que es menos que elegante! Deseo que toda la validación y los datos dinámicos se jueguen juntos un poco mejor. – GraemeMiller

+0

Acabo de tropezar con esta publicación, que parece que proporciona una de las mejores soluciones para conectar la validación del lado del servidor mvc a knockoutjs. Me gustaría seguir sobre este tema y ver si esto funcionó para usted, @GraemeMiller bien o si tuvo problemas. Si funcionó bien, me pregunto si podría publicar un poco más de los ejemplos de código para esto. – Dmitry

+0

A primera vista, creo que [esto] (http://bojankaurin.github.io/knockout-server-side-validation/) logra algo como se describe en la respuesta anterior. – bvgheluwe

Cuestiones relacionadas