c# - net - Cómo obtener una clave ModelState de un elemento en una lista
modelstate.isvalid c# (2)
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 FreeFields[1].DisplayName
el error de validación.
Por lo que sé, no se puede obtener fácilmente eso del controlador.
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 las 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
toString()
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<FieldModel>();
}
[HiddenInput(DisplayValue=false)]
public int ID { get; set; }
public IList<TemplateFieldModel> 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<Func<CreateFieldsModel, string>> 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);
}