Accueil > .Net, ASP.Net, C#, MVC2 > [C#4 MVC2] Les méthodes d’action du controller

[C#4 MVC2] Les méthodes d’action du controller

Dans l’article précédent, j’ai parlé de la méthode OnActionExecuting(ActionExecutingContext).

Ceci dit, il y a d’autres méthodes qui peuvent être utiles (elles seront également présentes dans la BaseController).

Déjà, qu’en est-il de leur ordre d’exécution ?

Le voici (du moins pour celles qui me paraissaient pertinentes) :

Méthode d’action Description MSDN
void Execute(System.Web.Routing.RequestContext) Exécute le contexte de la requête spécifiée.
void Initialize(System.Web.Routing.RequestContext) Initialise des données qui peuvent ne pas être disponibles lorsque le constructeur est appelé.
void ExecuteCore() Exécute la requête.
ITempDataProvider CreateTempDataProvider() Crée un fournisseur de données temporaire.
IActionInvoker CreateActionInvoker() Crée un demandeur d’action.
void OnAuthorization(AuthorizationContext) Méthode appelée lors de l’autorisation.
void OnActionExecuting(ActionExecutingContext) Méthode appelée avant la méthode d’action.
void OnActionExecuted(ActionExecutedContext) Méthode appelée après la méthode d’action.
void OnResultExecuting(ResultExecutingContext) Méthode appelée avant l’exécution du résultat d’action qui est retourné par une méthode d’action.
void OnResultExecuted(ResultExecutedContext) Méthode appelée après l’exécution du résultat d’action qui est retourné par une méthode d’action.
void Dispose(bool) Libère toutes les ressources qui sont utilisées par l’instance actuelle de la classe Controller.

A noter pour la méthode Execute, la MSDN dit :
« Cette méthode est une implémentation de Execute. Vous ne devez pas en général substituer cette méthode. Substituez Initialize ou ExecuteCore à la place. »

Et voici deux autres méthodes qui sont intéressantes :

Méthode d’action Description
protected virtual void OnException(ExceptionContext) Méthode appelée lorsqu’une exception non gérée se produit au cours de l’action.
protected virtual void HandleUnknownAction(string) Méthode appelée lorsqu’une requête correspond à ce contrôleur, mais qu’aucune méthode portant le nom d’action spécifié n’est trouvée dans le contrôleur.

J’ai choisis, dans l’article précédent, de vérifier que l’utilisateur n’est pas anonyme dans la méthode OnActionExecuting, mais la méthode OnAuthorization est bien placée pour cela.

Dans la méthode OnException, on va naturellement gérer les exceptions qui peuvent arriver.

Une des questions que je me suis poser : comment alimenter un model spécifique et rediriger vers une page qui va l’exploiter ?

C’est assez simple :

/// <summary>
/// Evènement appelé lorsqu'une exception non gérée est levée.
/// </summary>
/// <param name="filterContext">Le context de l'action.</param>
protected override void OnException(ExceptionContext filterContext)
{
    try
    {
        // Publication de l'exception
    }
    catch { }
    // On redirige vers la page d'erreur
    HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception,
        filterContext.Controller.ToString(),
        (string)filterContext.RouteData.Values["action"]);
    ViewResult result = new ViewResult() {
        ViewName = "Error",
        TempData = filterContext.Controller.TempData,
        ViewData = new ViewDataDictionary<HandleErrorInfo>(model)
    };
    filterContext.Result = result;
    filterContext.ExceptionHandled = true;
    filterContext.HttpContext.Response.Clear();
    filterContext.HttpContext.Response.StatusCode = 500;
    filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}

Dans le cas où la route par défaut est utilisée, il y a toujours moyen de modifier l’url pour faire pointer vers des actions qui ne sont pas prises en charge.

Dans ce cas là, on va devoir utiliser la méthode HandleUnknwonAction (elle porte bien son nom, n’est ce pas ?).

Dans le cas d’une action non connue, par exemple http://localhost/Home/Unknow, une HttpException est levée dans la méthode HandleUnknwonAction.

Du coup, il suffit simplement d’avoir un code du type :

/// <summary>
/// Evènement appelé lorsqu'une action non reconnue est appelée (ex : /Home/UnknowAction).
/// </summary>
/// <param name="actionName">Nom de l'action.</param>
protected override void HandleUnknownAction(string actionName)
{
    try
    {
        base.HandleUnknownAction(actionName);
    }
    catch (HttpException ex)
    {
        HandleErrorInfo model = new HandleErrorInfo(ex,
            this.ToString(),
            actionName);
        // Publication de l'exception
        // […]
        this.View("Error", model).ExecuteResult(this.ControllerContext);
    }
}
Catégories :.Net, ASP.Net, C#, MVC2
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :