c# asp.net asp.net-mvc model-binding remote-validation

c# - Validación remota para la LISTA de MODELOS



asp.net asp.net-mvc (1)

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<Person> ... @for (var i = 0; i < Model.Count; i++) { @Html.EditorFor(m => m[i].Username) }

Esto generará html como

<input name="[0].UserName" ... /> <input name="[1].UserName" ... />

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

$.ajax({ url: ''/Person/IsValidUserName'', data: { [0].UserName: ''[email protected]'' }, ...

que no se unirá.

He informado de esto como un problema en Codeplex con una posible solución. Mientras tanto, puede 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 eliminará el prefijo para que los datos publicados sean

data: { UserName: ''[email protected]'' },

y se unirá correctamente al método.

Usé 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 vuelve nulo. Después de toneladas de investigación, descubrí que todos descubrieron los Prefijos BIND. Eso sería genial en muchas circunstancias, pero no en esta. Debo señalar que todas las propiedades y nombres se alinean, sin embargo, en mi bucle for, el EditorFor crea un campo [i] .Username y esto no se asigna a ninguna propiedad del modelo.

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

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

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

EDITAR: Lo arreglé haciendo lo siguiente, pero no estoy seguro de si esta es la mejor idea. Establecí el parámetro igual al FieldName sin el prefijo [i], pero aún recupero el elemento con el prefijo [i]. Javascript no es mi Forte, así que 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); });