2011-07-18 23 views
21

¿Deberían los viewmodels estar limitados a solo tener propiedades y no métodos?ASP.NET MVC ViewModel con métodos: ¿es "legal"?

Digamos que tengo un botón de opción en mi opinión, y quiere ver si el botón de radio debe ser revisado.

que podía hacer esto por completo en mi opinión:

@Html.RadioButton("radiobuttonName", "The value", (id == Model.PersonId)) 

o podía mover esta lógica en el modelo de vista:

@Html.RadioButton("radiobuttonName", "The value", Model.IsChecked(id) 

uso de este método en el modelo de vista:

public int PersonId { get;set;} 
    public bool IsChecked(int id) 
    { 
     return (id == PersonId); 
    } 

¿Está bien hacerlo, o debería hacerse por completo en la vista, o de alguna otra manera?

+0

La práctica es - Si se complementa la vista entonces sí que está muy bien. BUt que se puede estirar un largo camino también :) Siempre que haga lo que necesita hacer de una manera consciente. No te preocupes demasiado. – ppumkin

Respuesta

12

Usted puede tener métodos tienen en su ViewModel. Si se trata de un único resultado que desea calcular cada vez que te sugiero añadir el código de evaluación a su Controller y almacenar el resultado en el ViewModel lugar, pero si tiene que evaluar las cosas usando un método más dinámica y una propiedad no se puede hacer esto para que luego haga esto en el ViewModel probablemente esté bien.

En su ejemplo anterior, recomendaría hacer esto en el ViewModel ya que el ViewModel contiene la lógica en un solo lugar en lugar de copiar y pegar tantas veces en su View.

+0

Se dice que no debería existir ninguna lógica en ViewModel. Esa mejor práctica de codificación. Pero es una buena funcionalidad que el viewModel actualice todas sus propiedades en una devolución de datos llamando a una función para hacer eso. (Sin embargo, la lógica empresarial está separada. Solo Linq y se obtienen datos). Me di cuenta de que si NO declaras una propiedad en tu vista que los datos no se envían al cliente, punto. Por lo tanto, está "protegido": solo tenga cuidado con qué y cómo expone las propiedades :) – ppumkin

4

Esa es una muy buena pregunta respecto a la colocación correcta de la lógica. Su enfoque es sin duda legal - pero sigue el espíritu de MVC? :)

yo diría que depende de si la lógica de su método se aplica solo a este Ver/modelo de vista, o se podría aplicar potencialmente a otros ViewModels que se ocupan de este tipo de modelo subyacente (en su caso, persona)

Si esto es un cálculo único para los fines de este modelo de vista específico, que sea en el modelo. Si este cálculo se puede usar para objetos de Persona en general, considere usar una clase de servicio estático, p. PersonService, y coloque sus métodos allí.