2011-04-18 18 views
5

con anotaciones de datos ahora es fácil de localizar mensajes de error utilizando archivos Resource.resx así por ejemplo:¿Cuál es la mejor forma de localizar errores de anotación de datos no con ASP.NET MVC 3?

public class Student 
{ 
    . . . 

    [Required(ErrorMessageResourceName ="Required", 
    ErrorMessageResourceType = typeof(StudentResources))] 
    [StringLength(16)] 
    [Display(Name = "FirstName", ResourceType = typeof(StudentResources))] 
    public string FirstName { get; set; } 

    . . . 
} 

Ahora, supongamos que quiero comprobar si un estudiante ya ha realizado un pago por un mes dado y año:

public bool CheckIfAlreadyPaid(Payment payment) 
{ 
    return repository.GetPayments().Any(p => p.StudentId == payment.StudentId && 
             p.Month == payment.Month && 
             p.Year == payment.Year); 
} 

Si ya ha realizado el pago, estoy haciendo lo siguiente en mi capa de servicios:

if (CheckIfAlreadyPaid(payment)) 
{ 
    modelState.AddModelError("AlreadyPaid", 
    Resources.Views.Payment.PaymentCreateResources.AlreadyPaid); 
} 

funciona, pero no confío en hacer referencia al archivo de recursos dentro de la capa Servicios.

¿Existe una forma estándar o mejor de localizar los mensajes de error que no están vinculados a las propiedades del modelo (Anotación de datos), errores que provienen de las reglas de la lógica de negocios? ¿Debo seguir agregando estos errores a ModelStateDictionary?

Respuesta

0

Lo hice de una manera diferente. La capa Service se usa para verificar si el pago ya se realizó. En mi Controller agrego un mensaje de error de validación al objeto ModelState que le pasa un recurso de cadena localizado. Ahora me siento más cómodo con este enfoque.

Aquí está el código:

/// <summary> 
/// Performs validation of business logic... 
/// </summary> 
/// <param name="payment"></param> 
/// <returns></returns> 
private bool ValidatePayment(Payment payment) 
{ 
    if (paymentService.IsPaymentMade(payment)) 
    { 
     ModelState.AddModelError("AlreadyPaid", Localization.AlreadyPaid); 
    } 

    return ModelState.IsValid; 
} 

EDIT:

Para complementar mi respuesta, me acabo de enterar hoy que ValidationSummary@Html.ValidationSummary(true) hace exactamente lo que quiero:

Html.ValidationSummary devuelve una lista desordenada (elemento ul) de los mensajes de validación que están en el ModelStateDictionary objeto y muestra opcionalmente solo errores de modelo a nivel de modelo.

estoy pasando true y lo hará sólo los errores a nivel de modelo de visualización (errores de anotación de datos no) en el resumen justo en la parte superior de la página. Esto es genial, pero solo si funcionara ... :)

Me enfrentaba un problema donde mis mensajes de error personalizados no vinculados a las propiedades del modelo no aparecían cuando establecí ValidationSummary(true). Luego busqué usando Google y encontré este post. Probé su solución pero no funcionó. Luego busqué un poco más y encontré esto link en Google Books (Pro ASP.NET MVC 2 Framework por Steven Sanderson).

Intenté lo que aquí se describe pasando una cadena vacía como clave (string.Empty) y funcionó.

if(paymentService.IsPaymentMade(payment)) 
{ 
    ModelState.AddModelError(string.Empty, Localization.PaymentAlreadyCreated); 
} 
0

Estoy de acuerdo, no creo que deba estar en la capa de servicio. Parece que podría ser puesto en un atributo de validación de datos personalizado o manejado con algún otro enfoque en ese nivel (usar Fluent Validation podría ser una buena opción). De cualquier manera, creo que mientras la validación permanezca en la aplicación MVC, puede sentirse cómodo usando los archivos de recursos para almacenar los mensajes.

Cuestiones relacionadas