Cómo obtener una clave ModelState de un elemento en una lista

Problema

Tengo una lista de campos que el usuario puede editar. Cuando se envíe el modelo, quiero comprobar si estos elementos son válidos. No puedo usar notaciones de datos porque cada campo tiene un proceso de validación diferente que no conoceré hasta el tiempo de ejecución. Si la validación falla, uso el ModelState.AddModelError(string key, string error) donde la clave es el nombre del elemento html al que desea agregar el mensaje de error. Dado que hay una lista de campos, el nombre que Razor genera para el elemento html es como Fields[0].DisplayName . ¿Mi pregunta es si hay un método o una forma de obtener la clave del nombre html generado del modelo de vista?

Intento de solucion

Intenté el método toString() para la clave sin suerte. También miré a través de la clase HtmlHelper pero no vi ningún método útil.

Fragmento de código

Ver Modelo

 public class CreateFieldsModel { public TemplateCreateFieldsModel() { FreeFields = new List(); } [HiddenInput(DisplayValue=false)] public int ID { get; set; } public IList FreeFields { get; set; } public class TemplateFieldModel { [Display(Name="Dispay Name")] public string DisplayName { get; set; } [Required] [Display(Name="Field")] public int FieldTypeID { get; set; } } } 

Controlador

 public ActionResult CreateFields(CreateFieldsModel model) { if (!ModelState.IsValid) { //Where do I get the key from the view model? ModelState.AddModelError(model.FreeFields[0], "Test Error"); return View(model); } } 

Después de escarbar en el código fuente encontré la solución. Existe una clase llamada ExpressionHelper que se usa para generar el nombre html para el campo cuando se llama a EditorFor() . La clase ExpressionHelper tiene un método llamado GetExpressionText() que devuelve una cadena que es el nombre de ese elemento html. Aquí es cómo usarlo …

 for (int i = 0; i < model.FreeFields.Count(); i++) { //Generate the expression for the item Expression> expression = x => x.FreeFields[i].Value; //Get the name of our html input item string key = ExpressionHelper.GetExpressionText(expression); //Add an error message to that item ModelState.AddModelError(key, "Error!"); } if (!ModelState.IsValid) { return View(model); } 

Debe encuadrar la clave (nombre del elemento de entrada) dentro del controlador en función de cómo esté representando los campos en el formulario.

Por ej. Si la validación del segundo elemento en la colección FreeFields de CreateFieldsModel falla, puede encuadrar el nombre del elemento de entrada, es decir, clave como FreeFields[1].DisplayName donde se va a asignar el error de validación.

Por lo que sé, no se puede obtener fácilmente eso del controlador.