Validación remota para LISTA de MODELOS

Utilicé el siguiente tutorial: http://msdn.microsoft.com/en-us/library/gg508808%28VS.98%29.aspx

Y todo parecía estar bien, pero en mi caso, el nombre de usuario de cadena siempre regresa nulo. Después de toneladas de investigación, descubrí que todos descubrieron Prefijos BIND. Eso sería genial en muchas circunstancias, pero no en este caso. Debo señalar que todas las propiedades y los nombres se alinean, sin embargo, en mi ciclo for, el editor crea un campo [i] .Username y no se asigna a ninguna propiedad del modelo.

PREGUNTA: Creo que quiero asignar [i] .Username a Username donde i es cualquier número de 0-infinito, por lo que cuando GETS, el valor se pasa a la acción correctamente. ¿Cómo hago esto? Si esto es incorrecto, ¿qué hago para validar esto para una fila específica en una tabla?

@for (var i = 0; i < Model.Count; i++) { BLAH BLAH BLAH CODE FOR BUILDING TABLE ROWS  @Html.EditorFor(modelItem => Model[i].Username)  } 

Como técnicamente podría tener CIENTOS si no MILES de registros, preferiría no tener un PREFIJO vinculante para todos los 1000. ¿Me falta algo fundamentalmente aquí? Soy nuevo en ASP.NET MVC y estoy acostumbrado a WebForms así que siento que algunas veces estoy mezclando conceptos y machacando algo que está completamente mal.

EDITAR: Lo arreglé haciendo lo siguiente, pero no estoy seguro si esta es la mejor idea. Establezco el parámetro igual a FieldName sin el prefijo [i], pero aun así recupero el elemento con el prefijo [i]. Javascript no es mi Forte así que por favor avíseme si es horrible.

 adapters.add("remote", ["url", "type", "additionalfields"], function (options) { var value = { url: options.params.url, type: options.params.type || "GET", data: {} }, prefix = getModelPrefix(options.element.name); $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) { var paramName = fieldName.substr(fieldName.lastIndexOf(".") + 1); var actualFieldName = appendModelPrefix(fieldName, prefix) value.data[paramName] = function () { return $(options.form).find(":input").filter("[name='" + escapeAttributeValue(actualFieldName) + "']").val(); }; }); setValidationValues(options, "remote", value); }); 

No ha publicado su código para el modelo o controlador, pero suponiendo que tiene un RemoteAttribute aplicado a la propiedad Username , por ejemplo

 public class MyModel { [Remote("IsValidUserName", "Person")] public string Username { get; set; } } 

con un método en PersonController

 public JsonResult IsValidUserName(string Username) { .... } 

y la vista

 @model List ... @for (var i = 0; i < Model.Count; i++) { @Html.EditorFor(m => m[i].Username) } 

Esto generará html como

   

Lamentablemente, el método remote en jquery-validate muestra el nombre y el valor del elemento para que la llamada ajax se vea como

 $.ajax({ url: '/Person/IsValidUserName', data: { [0].UserName: 'someone@somewhere.com' }, ... 

que no se unirá.

He informado esto como un problema en Codeplex con una posible solución. Mientras tanto, puedes modificar el método remote en el archivo jquery-validate.js la siguiente manera

 remote: function(value, element, param) { .... var data = {}; // data[element.name] = value; data[element.name.substr(element.name.lastIndexOf(".") + 1)] = value; // add this 

Esto quitará el prefijo para que los datos publicados sean

  data: { UserName: 'someone@somewhere.com' }, 

y se unirá correctamente al método.