2009-02-03 8 views
13

J'ai un ActionFilter qui vérifie si un paramètre dans l'URL est valide. Si ce n'est pas valide, je dois rendre une vue. Je ne veux pas rediriger, car j'ai toujours besoin du ActionExecutingContext. Est-ce que cela peut être fait?Retour Vue d'ActionFilter

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Guid processIdentifier = (Guid)filterContext.RouteData.Values["processIdentifier"]; 
     //if processIdentifier not found render a view with message and some other objects in ViewData 
     filterContext.Controller.ViewData.ModelState.AddModelError("WrongProcessIdentifier", "The process-id you supplied is not valid"); 
     base.OnActionExecuting(filterContext); 
    } 

Répondre

31

HandleErrorAttribute eu ce que je cherchais.

filterContext.Result = new ViewResult 
      { 
       ViewName = "MessagePage", 
       ViewData = filterContext.Controller.ViewData, 
       TempData = filterContext.Controller.TempData 
      }; 
+0

Je pense que vous devriez accepter votre propre réponse car elle inclut le code –

+1

Pour tout ce que ça vaut, je n'ai pas intentionnellement inclus de code, puisque cette zone de code change avec chaque version du framework MVC en ce moment. Je pense que la bonne réponse est «faites ce que le cadre est en train de faire». –

1

Oui. Regardez la source de HandleErrorAttribute.

0

Essayez cette

[HandleError] 
public ActionResult MyAction (int id) 
{ 
    // ... 
} 

et PUT la vue que vous voulez rendiez pour ~/Views/Shared/Error.ascx.

+0

Les filtres comme [HandleError] s'appliquent uniquement aux méthodes d'action. La méthode OnActionExecuting() est elle-même un filtre plutôt qu'une méthode d'action, donc des attributs comme celui-ci n'ont aucun effet. – Levi

+0

Désolé je n'ai même pas regardé la méthode. J ai mis a jour. –