2011-06-06 8 views
5

Trabajando en una aplicación ASP.NET MVC 3 (Razor), que se refiere principalmente a UGC (contenido generado por el usuario).¿Cuál es una forma limpia/SECA de mostrar las operaciones disponibles en el contenido del usuario?

Estoy trabajando en una zona "Q & A" - donde los usuarios pueden hacer preguntas, otros pueden responder, votar, etc.

Como tal, estoy tratando de encontrar una manera limpia de manejar las operaciones disponibles que un usuario puede hacer en cualquier página determinada, en función de su función y otros factores.

Considere el escenario de la "Página de detalles de la pregunta" (como esta página en Desbordamiento de pila).

Cualquier (autenticado) el usuario puede:

  • Vote por la pregunta/respuesta
  • respuesta propietario

pregunta puede:

  • Editar
  • Eliminar
  • Marca la respuesta

Y así sucesivamente.

Ahora, tengo un QuestionViewModel, que se utiliza para mostrar la pregunta y las respuestas relevantes para esta vista en particular.

Lo creo usando AutoMapper.

¿Cómo puedo mostrar "notas adhesivas" (por ejemplo, hipervínculos) en la página, en función de las operaciones disponibles?

Mi pensamiento actual es:

  • creo una enumeración: QuestionOperation (respuesta, Editar, Desactivar, Voto, respuesta, etc.)
  • agrego una propiedad de tipo IEnumerable<QuestionOperation> a mi modelo de vista
  • Establecí esta propiedad en mi método de acción (HTTP GET), verificando si el usuario está autenticado y las funciones de las que forma parte.
  • entonces yo uso un editor de plantillas para hacer de cada operación como un hipervínculo, utilizando Html.ActionLink

¿se considera un enfoque limpio - o puede alguien sugerir una mejor?

Teniendo en cuenta que estoy reutilizando este QuestionViewModel en tres páginas:

  1. El detalle de una pregunta página
  2. El "Haz una pregunta" página
  3. La "Edición de una pregunta" página

Por lo tanto, debido a que estas operaciones dependen de la página o del usuario, realmente no se puede hacer con AutoMapper.

Respuesta

1

Configuraría un controlador y una acción separados que devolverán una vista parcial que contiene los enlaces necesarios. Entonces usaría el ayudante Html.Action para incluirlo desde la vista principal.

algo entre las líneas:

public class UserLinksController: Controller 
{ 
    // TODO: ctor DI of a repository, etc... 

    public ActionResult Index(string questionId) 
    { 
     string username = User.Identity.IsAuthenticated 
      ? User.Identity.Name : string.Empty; 
     var roles = _repository.GetRolesForQuestion(username, questionId); 
     var model = Mapper.Map<UserRoles, RolesViewModel>(roles); 
     return PartialView(model); 
    } 
} 

y en el parcial correspondiente que le compruebe el modelo de vista y hacer que los enlaces necesarios:

@model RolesViewModel 
@if(Model.CanEdit) 
{ 
    @Html.ActionLink("Edit", "Edit", "Questions")  
} 
@if(Model.CanDelete) 
{ 
    @Html.ActionLink("Delete", "Delete", "Questions")  
} 
... 

ahora en algún lugar de su vista principal basta con incluir esta acción utilizando el método Html.Action:

@Html.Action("Index", "UserLinks", new { questionId = Model.QuestionId }) 
+0

leyó mi mente, eso es en realidad lo que terminó haciendo! Creé un método de acción llamado "ShowOptions", que tomó la identificación de la publicación (la hizo más genérica que la pregunta) y luego proporcionó una vista parcial. Luego lo hice usando un ajax '$ .get' (no quería que se procesara inmediatamente, sino que después de un clic en" Mostrar opciones "). Pero sí, esto es básicamente lo que terminé haciendo. Me alegra que estemos en la misma página! – RPM1984

Cuestiones relacionadas