2010-12-15 11 views
11

He estado acostumbrado a decorar clases de modelos de datos con atributos de anotación de datos, pero el purista en mí se empeña en incluir atributos puramente de presentación como el formato de visualización aquí. Sin embargo, me complace mantener aquí los atributos centrados en la validación. Una buena razón por la que tengo que seguir guardando todas las anotaciones, etc. en el modelo de datos es que mi modelo de vista agrega clases de modelo de datos, p. Mi propiedad ViewModelBase.DetailItem<TEntity> en el modelo de vista es solo una referencia a una clase de entidad en mi modelo de datos. Si quisiera mover las anotaciones de presentación al modelo de vista, tendría que revisar radicalmente mi diseño a uno donde duplique las propiedades del modelo de datos en mi modelo de vista y use una herramienta de mapeo de objetos para poblar objetos del modelo de visualización basados ​​en objetos del modelo de datos.¿Las anotaciones de datos deben estar en el modelo o en el modelo de vista?

¿Dónde debería estar haciendo mis anotaciones de datos?

Sólo Por cierto, esto es lo que mi borrador ViewModelBase siguiente aspecto:

public class ViewModelBase<T> 
{ 
    public virtual string PageTitle { get; set; } 
    public virtual string ViewHeading { get; set; } 

    public virtual ViewMode ViewMode { get; set; } 
    public virtual IEnumerable<T> ItemList { get; set; } 
    public virtual T DetailItem { get; set; } 
} 
+0

También visita: http://stackoverflow.com/questions/3338919/mvc-validation-using-data-annotations-model-classes-or-view-model-classes – DarrellNorton

Respuesta

7

Comparto la misma preocupación sobre el principio DRY y la validación, por lo que prefiero mantener la mayoría de los requisitos de validación en el modelo. ¿Pero por qué tiene que ser uno o el otro? La Validación del modelo pertenece al modelo, pero existen ciertas validaciones específicas de la vista que pertenecen al modelo de vista.

Dicho esto, las anotaciones de datos son solo eso: anotaciones en torno a los datos. No es la lógica de validación adecuada. La lógica de validación es un concepto completamente diferente a las anotaciones de datos (un atributo obligatorio es simplemente un aspecto de la validación). Personalmente, me resulta difícil ubicar donde la validación real se ajusta a una implementación de MVVM, ya que algunas validaciones requieren contexto en lugar de solo requerirlo o no.

Respuesta corta: si está en su modelo, entonces se agrega a sus modelos de vista. Si hay un requisito específico de vista, el modelo de vista puede satisfacer requisitos adicionales si es necesario.

+0

Hola @William, mucho tiempo sin leer :-) Me gusta lo que dices sobre la validación agregada a los modelos de vista, pero tengo algunos obstáculos para agregar validación adicional para agregar tipos de vista de tipo. Veré si encuentro algo funky más tarde esta noche. – ProfK

+0

Quizás los modelos de vista no se abstraigan lo suficiente de los modelos (o, a la inversa, no se abstraen lo suficiente de las vistas) para facilitar la toma de decisiones. Sigo creyendo que la validación no es específica para las vistas. Puede haber un contexto involucrado (por ejemplo, se requiere un nombre en un sistema hospitalario, excepto en el caso de los recién nacidos, donde todavía no se aplica ningún nombre), pero la lógica de validación y el razonamiento raramente se aplican a una vista específica solamente. – WilliamB

+0

Me pregunto quién te votó aquí. Realmente no es necesario si me preguntas. – ProfK

11

validación debe al menos ser realizado en el modelo de vista, porque esto es lo que recibe de la vista. Además, la validación siempre se realiza en el contexto de una vista determinada. Por lo tanto, podría tener dos modelos de vista diferentes correspondientes a dos vistas diferentes pero asignados a una única clase de modelo y dado que la validación podría ser diferente según la vista, esta validación debe realizarse en el modelo de vista. Si realizó la validación en el modelo, entonces tendría dificultades para distinguir entre los dos casos, porque podría tener una situación en la que se requiere una propiedad en la primera vista, pero no es necesaria en la segunda vista. Entonces, si está utilizando anotaciones de datos para realizar la validación, debe decorar su modelo de vista con ellos.

+0

buen punto acerca de las dos validaciones diferentes, pero parece considerar el modelo más como un DTO que como un modelo de dominio completo con lógica comercial para atender casos de uso diferentes, donde cada caso de uso será atendido por un modelo de vista y vista diferente. – ProfK

Cuestiones relacionadas