2010-10-07 18 views
4

Je veux faire ce qui suit:MVC utilisant Action Filter pour vérifier les paramètres dans l'URL. arrêter l'action d'exécuter

lorsque l'URL ne dispose pas d'un instID, je veux rediriger vers la "Instelling" l'action

dans ce contrôleur , chaque méthode a besoin du instID .

 [RequiredParameter(parameterName="instID", controllerToSend="Instelling")] 
     public ActionResult Index(int? instID) { 
      //if (!instID.HasValue) { 
      // return RedirectToAction("Index", "Instelling"); 
      //} 

      var facts = _db.Instellingens.First(q => q.Inst_ID == instID).FacturatieGegevens; 

      return View(facts); 
     } 

donc c'est dans le contrôleur.

le ActionFilter:

namespace MVC2_NASTEST.Controllers { 
    public class RequiredParameterAttribute : ActionFilterAttribute { 

     public string parameterName { get; set; } 
     public string actionToSend { get; set; } 
     public string controllerToSend { get; set; } 

     public override void OnActionExecuting(ActionExecutingContext filterContext) { 

      if (parameterName != string.Empty) { 
       if (filterContext.ActionParameters.ContainsKey(parameterName) && filterContext.ActionParameters[parameterName] != null) { 
        string s = "test"; 
        //all is good 
       } else { 
        //de parameter ontbreekt. kijk of de controller en de action geset zijn. 
        if (actionToSend == string.Empty) 
         actionToSend = "Index"; 
        if (controllerToSend == string.Empty) { 
         controllerToSend = filterContext.Controller.ToString(); 
         controllerToSend = controllerToSend.Substring(controllerToSend.LastIndexOf(".") + 1); 
         controllerToSend = controllerToSend.Substring(0, controllerToSend.LastIndexOf("Controller")); 
        } 

        UrlHelper helper = new UrlHelper(filterContext.RequestContext); 
        string url = helper.Action(actionToSend, controllerToSend); 

        HttpContext.Current.Response.Redirect(url); 
        //filterContext.HttpContext.Response.Redirect(url, true); 
       } 
      } 

      base.OnActionExecuting(filterContext); 
     } 

     public override void OnActionExecuted(ActionExecutedContext filterContext) { 


      base.OnActionExecuted(filterContext); 
     } 

    } 
} 

la chose est: il ne fonctionne pas, cependant, l'action elle-même obtient d'abord exécuté, la redirection se produit. ce n'est pas ce que je voulais.

Peut-être que je ne devrais pas utiliser les filtres d'action, mais juste ajouter un itinéraire? Dans ce cas, comment rediriger la route vers un autre contrôleur si l'instID est manquant?

+1

Et si au lieu d'utiliser un attribut, vous remplacez le OnActionExecuting dans votre contrôleur? Si chaque action sur ce contrôleur nécessite cette logique, cela pourrait être une bonne option. –

Répondre

7

Plutôt que de créer un filtre d'action (qui se déroule juste avant le retour de la méthode d'action), vous pourriez envisager de passer à un filtre d'autorisation qui vous permettra de rediriger vers un contrôleur alternatif & l'action

Quelque chose comme ça (code pseudo):

public class RequiredParameterAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     // read instID from QueryString 
     // if instId is null, return false, otherwise true 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.result = new RedirectToRouteResult(new { controller = "MyController" , action = "MyAction" } ) 
    } 

}

+0

un peu plus d'informations sur ce sujet serait le bienvenu – Stefanvds

+0

voir pseudo exemple - l'espoir qui aide – Clicktricity

+0

le pseudo code m'a aidé à y arriver! Merci – Stefanvds

2

Ce fut le premier résultat sur une question que je posais sur Google, donc je voudrais proposer une réponse différente. Au lieu de faire la redirection de l'action assignez une redirection vers la filterContext.Result comme ceci:

filterContext.Result = new RedirectResult(url); 

Si la propriété de résultat de la filterContext n'est pas nul alors l'action sous-jacente ne sera pas exécuté. Comme vous effectuez une redirection en dehors du contexte de l'appel, vous continuez à exécuter la méthode d'action.