2009-04-17 20 views
6

Cuando un usuario inicia sesión en mi aplicación, quiero mostrar su nombre en toda la aplicación. Estoy usando el framework asp.net MVC. Pero lo que no quiero es que se tiene que poner en cada controlador algo como:C# Centralizar repetición de VIewData en MVC

ViewData["User"] = Session["User"]; 

Esto debido a que no puede repetirse. (Creo que este es el principio DRY [No repetir) de la programación OO.] ViewData ["User"] está en mi página maestra. Así que mi pregunta es, ¿cuál es una forma ordenada de manejar mi ViewData ["Usuario"] en un solo lugar?

Respuesta

12

Puede hacerlo con bastante facilidad, ya sea en una clase base de controlador o en un filtro de acción que se aplica a los controladores/acciones. En cualquier caso, tiene la oportunidad de tocar la solicitud antes (o después) de la acción, para que pueda agregar esta funcionalidad allí.

Por ejemplo:

public class UserInfoAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(
     ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 
     filterContext.Controller.ViewData["user"] = "Foo"; 
    } 
} 
... 
[HandleError, UserInfo] 
public class HomeController : Controller 
{...} 

(también se puede utilizar en el nivel acción (método))


o con una base de clase común:

public abstract class ControllerBase : Controller 
{ 
    protected override void OnActionExecuting(
     ActionExecutingContext filterContext) 
    { 
     ViewData["user"] = "Bar"; 
     base.OnActionExecuting(filterContext); 
    } 
} 

[HandleError] 
public class HomeController : ControllerBase 
{...} 
+0

Thnx, voy a probar la clase base. ¿Pero por qué anular el método OnActionExecuting()? ¿Qué hace este método? ¿Cual es su propósito? – Martijn

+0

Se ejecuta justo antes de que se ejecute su acción (método). Si lo desea, probablemente pueda usar OnActionExecuted en su lugar, que se ejecuta inmediatamente * después de que se ejecute su acción. –

+0

Bueno, ¿y porque estoy poniendo esto en mi clase base, afecta todas mis acciones dentro del controlador? – Martijn

2

Crea una clase base para tus modelos con la propiedad UserName:

public abstract class ModelBase 
{ 
    public string UserName { get; set; } 
} 

Cree una clase base para sus controladores y anule su método OnActionExecuted. Dentro de este, compruebe si el modelo se deriva de BaseModel y, de ser así, configure su propiedad UserName.

public class ControllerBase : Controller 
{ 
    protected override void OnActionExecuted(
     ActionExecutedContext filterContext) 
    { 
     var modelBase = ViewData.Model as ModelBase; 

     if (modelBase != null) 
     { 
      modelBase.UserName = "foo"; 
     } 

     base.OnActionExecuted(filterContext); 
    } 
} 

entonces usted será capaz de mostrar el nombre de usuario del usuario en la vista de la siguiente manera:

<%= Html.Encode(Model.UserName) %> 

Véase también:

+0

"comprueba si el modelo se deriva de BaseModel y ..." ¿cómo hago esto? ¿Puedes darme un ejemplo? – Martijn

+0

@Martijn, agregó un ejemplo. –

+0

Creo que recibo su solución. Pero no es un poco complicado? ¿No hace la clase base común de Marc Gravell lo mismo de alguna manera? – Martijn

1

Otro método para proporcionar datos de modelo persistentes a través de todo su solicitud está reemplazando el DefaultFactoryController con tu personalizado. En su CustomerFactoryController, hidrataría el ViewBag con el modelo que desea persistir.

Cuestiones relacionadas