6

Contexto: creación de un servicio jsonP con métodos de controlador mvc que proporciona una definición de campos de formulario que incluye todas las reglas de validación.¿Cómo serializar un modelo con todos los atributos de validación de las propiedades individuales?

Mi problema es que no sé cómo serializar los atributos de validación. Prefiero los atributos de validación en el mismo formato en que Razor los serializa cuando usa validación discreta en vistas de Mvc normales.

Para serializar a json utilizo NewtonSoft.Json (4.0.2).

Ejemplo de modelo: Perfil clase pública {

[Required(ErrorMessage="This field is required.")] 
    [StringLength(25, ErrorMessage="Max 25 chars.")] 
    public string Firstname{get;set;} 
    } 

Ejemplo de javascript serializado preferido:

 {"Firstname": "John", 
     "ValidationRules":[{"data-val-required":"This field is required.", "data-val-length-max":25, "data-val-length":"Max 25 chars." }]} 

Cualquier ayuda o punteros son muy apreciados.

Respuesta

7

Esto construir un diccionario con los atributos de validación para una propiedad determinada en base a la anotación de los datos de atributos:

var metadata = ModelMetadataProviders.Current.GetMetadataForProperty(null, typeof(MyModel), "MyProperty"); 
var validationRules = metadata.GetValidators(ControllerContext).SelectMany(v => v.GetClientValidationRules()); 
var validationAttributes = new Dictionary<string, string>(); 

foreach (ModelClientValidationRule rule in validationRules) 
{ 
    string key = "data-val-" + rule.ValidationType; 
    validationAttributes.Add(key, HttpUtility.HtmlEncode(rule.ErrorMessage ?? string.Empty)); 
    key = key + "-"; 
    foreach (KeyValuePair<string, object> pair in rule.ValidationParameters) 
    { 
     validationAttributes.Add(key + pair.Key, 
      HttpUtility.HtmlAttributeEncode(
       pair.Value != null ? Convert.ToString(pair.Value, CultureInfo.InvariantCulture) : string.Empty)); 
    } 
} 

A continuación, debe serializar el diccionario validationAttributes con su propiedad en su encargo código de serialización JSON.

+0

Gracias, esto era exactamente lo que estaba buscando. – bees73

+0

alguna sugerencia para Web Api 2? – JenonD

Cuestiones relacionadas