2011-10-28 13 views
6

Entiendo que una vista solo debe mostrar cosas y no tiene lógica aparte de lo que se requiere para mostrar información.¿Cuán "separadas" deberían ser las vistas?

Cuál es la mejor manera, para mantener esto en mente, para manejar este tipo de escenario simple: clics

  1. usuario puede eliminar el elemento
  2. Si el artículo se sigue asociando con otros, muestran "que pueda 't eliminar esto.
  3. Si no, mostrar una forma de confirmar que los puestos a la acción/borrar/Id

Podría muy fácilmente en la vista de hacer algo como:

@if (Model.Children.Count > 0) 
{ 
    <p> 
    You can't delete this! 
    </p> 
} 
else 
{ 
    using (Html.BeginForm()) 
    { 
    <p> 
     Are you really sure you want to delete this? 
    </p> 
    <p> 
     <input type="submit" value="Confirm" /> | 
     @Html.ActionLink("Cancel", "Index") 
    </p> 
    } 
} 

¿Hay una razón de peso para hacer dos puntos de vista y hacer que el controlador devuelva la vista apropiada dependiendo de cuántos niños hay? Parece una compensación de simplicidad y separación de preocupaciones.

+0

voy a utilizar dos punto de vista , siempre es mejor hacer que tus puntos de vista sean lo más simples posible. –

Respuesta

4

Es un ejemplo bastante simple, por lo que a primera vista parece inofensivo (y si se mantiene así). Sin embargo, tenga en cuenta estos factores:

  • ¿Qué pasa si se convierte en algo más que los niños? Quizás otras tres relaciones aparezcan con el tiempo, ¿y ahora necesita verificarlas a su vista? De repente, el olor a código es mucho más fuerte.
  • Poner este tipo de lógica en el controlador puede hacer que otros enfoques al problema sean más obvios o fáciles más adelante, por ejemplo, agregar una versión ajax que le permita dar al usuario el comentario "no se puede eliminar esto" sin abandonar el anterior página.
3

Yo separaría aquellos en 2 vistas diferentes y haré que la acción del controlador elija la vista correcta en función del valor del modelo de vista (Children.Count en este caso). Pero dicho esto, el otro enfoque tampoco está mal. Funciona bien para escenarios simples como este.

2

Para este tipo de escenario, normalmente tendría una propiedad de modelo que realmente era la bandera de si puede eliminarla o no (esto está más en línea con un enfoque de ViewModel) para que la vista no sea en realidad haciendo la lógica, el controlador simplemente le dice a la vista qué acción hay disponible.

@if(Model.CanDelete) { 
    using (Html.BeginForm()) 
    { 
     <p> 
     Are you really sure you want to delete this? 
     </p> 
     <p> 
      <input type="submit" value="Confirm" /> | 
      @Html.ActionLink("Cancel", "Index") 
     </p> 
    } 
} else { 
    <p>You can't delete this!</p> 
} 

CanDelete puede ser llenado en el controlador utilizando una combinación de datos de estado del niño, los miembros de funciones, el estado de los negocios, etc., pero a la vista de todo eso no debería importar

Cuestiones relacionadas