2009-02-05 24 views
8

Soy relativamente nuevo en MVC, por lo que esta es una pregunta novata.Modelos específicos de vista en ASP.NET MVC?

Estoy tratando de comprender las mejores prácticas para mantener una clara separación de las preocupaciones en unos pocos escenarios que no aparecen directamente.

Hay dos escenarios que estoy viendo en este momento. Imagine una aplicación muy básica que permite a los usuarios ver y editar perfiles en línea para abogados. Hay una acción/vista para mostrar el perfil de un usuario en particular y una acción/vista para editar el perfil de un usuario en particular. Es fácil imaginar una clase Model agradable y limpia para representar los detalles del perfil de un usuario, tal vez realizada con Entity Framework y asignada a la tabla SQL del perfil de usuario.

En la vista de acción/vista para mostrar el perfil de un usuario, funcionalmente, necesito tener un botón o enlace que permita a un usuario editar el perfil. Pero eso solo debería estar disponible para algunos subconjuntos de usuarios. Por ejemplo, el usuario puede editar su propio perfil. Además, los superusuarios pueden editar el perfil de cualquier persona. Mi pregunta es cómo debería la Vista decidir si el enlace debería estar allí cuando se renderiza un perfil en particular. Supongo que es incorrecto que la Vista contenga la lógica para determinar si el usuario actual puede editar el perfil actual. ¿Debo agregar una propiedad IsEditable a la clase de modelo UserProfile? Eso no parece trágico, pero tampoco se siente completamente bien. ¿Debo hacer una nueva clase de modelo que agregue el perfil de usuario con información adicional sobre seguridad?

Otro escenario ... Al editar un perfil en particular, una de las cosas editable es la lista de especialidades para un abogado en particular. La lista de posibles especialidades no es fija. Si la vista desea renderizarlos en cuadro combinado, necesita la lista de todas las especialidades posibles de la base de datos. La vista no debería obtenerlos directamente de la base de datos, entonces ¿vuelvo a hacer el ejemplo agregado y le doy a View tanto el perfil de usuario como una lista de especialidades válidas?

Creo que el problema genérico que estoy tratando de resolver es si me siento cómodo con la creación de muchas pequeñas clases de modelos que son esencialmente específicas para vistas individuales. Cada clase incluiría las diversas partes no relacionadas del modelo de dominio más grande que se necesita para esa vista en particular.

Respuesta

2

Para su escenario, paso otro parámetro en ViewData, ViewData ["AllowEdit"] que se establece en true si la vista debe mostrar el enlace de edición. Prefiero esto para clonar el modelo en un modelo específico de vista para agregar este único atributo. A veces creo modelos específicos de vista, por ejemplo, tengo Grid ViewUserControl que toma un modelo de Grid, que puedo producir a partir de cualquier lista de otras clases de modelos, pero no lo haría en este caso.

A mi me gustaría hacer algo como esto:

<% if (Convert.ToBoolean(ViewData["AllowEdit"])) { %> 
<%= Html.ActionLink("Edit", "Edit", "Profile", 
        new { id = ViewData.Model.ID }, null) %> 
<% } %> 
1

Para su primera situación, probablemente tratar de encapsular la lógica para esto en el modelo de perfil, tal vez con una función como CanEdit() que acepta parámetros de información del usuario y comprueba si el usuario es el propietario del perfil o si tienen permisos de superusuario. Luego, en el controlador, llamaría a la función y pasaría los resultados a la vista usando ViewData.

Por el segundo, en la acción Editar controlador de perfil, recupere la lista de especialidades (a través del modelo) y páselo a la vista con ViewData.

0

Puede hacer una clase de modelo base para todas sus clases de modelos de vista e incluir allí información que puede considerarse útil en muchas vistas, incluso si no en todas. Por ejemplo, la ID del usuario actualmente conectado.

public class BaseModel 
{ 
    Guid ActiveUserId; 
} 

public class EditModel : BaseModel 
{ 
    Guid AuthorUserId; 
} 

Luego, en su opinión, se puede hacer una comparación básica:

<% if (Model.ActiveUserId == AuthorUserId) 
    Response.Write (Html.ActionLink (.....)) %> 

Esta simple comprobación está bastante bien, no es gran parte de la lógica y de todos modos, alguien debe decidir si debería aparecer este enlace . Puede hacer, por supuesto, dos vistas diferentes, con el enlace y sin una, pero es bastante exagerado.

3

El modelo ViewModel está más específicamente orientado al escenario que ha descrito. Puede usar el ViewData pero esta es la solución menos recomendada ya que pierde muchos de los beneficios del framework ASP.NET MVC. Por ejemplo, cuando usa ViewData, no tiene seguridad tipográfica, chekcing en tiempo de compilación y soporte intellisense en sus vistas.

Cuestiones relacionadas