0

J'utilise des attributs de routage (MVC) pour appeler contrôleur Méthodes et aussi un Authorizationattribute avec des propriétés personnalisées:Utiliser l'attribut des paramètres de routage pour d'autres attributs

[Route("{id:int}")] 
[UserAuth(ProjectId=3)] 
public ActionResult Select(int id) { 
    return JsonGet(Magic.DoSomethingMagic()); 
} 

UserAuth est un simple AuthorizationAttribute:

public class UserAuthAttribute:AuthorizeAttribute { 
    public int ProjectId { get;set;} 
    protected override bool AuthorizeCore(HttpContextBase contextBase) { 
     var currentProject=new Project(ProjectId); 
     return currentProject.UserIsMember() 
    }  
} 

Maintenant, je veux utiliser ceci avec un paramètre pour le projectId. Le code suivant ne fonctionne pas mais devrait montrer ce que je veux réaliser (je ne peux pas ajouter l'id)

[Route("{id:int}")] 
[UserAuth(ProjectId=id)] 
public ActionResult Select(int id) { 
    return JsonGet(Magic.DoSomethingMagic()); 
} 
+1

Ne transmettez pas l'ID à 'UserAuth'. Plutôt l'obtenir de l'objet 'Request'. Si vous voulez que la flexibilité soit de passer ou non l'identifiant à 'UserAuth', alors vous pouvez rendre le param nullable et si c'est null, alors vous le cherchez dans' Request'. –

Répondre

2

vous n'avez pas besoin de passer id de votre AuthorizationAttribute. vous pouvez l'obtenir à la demande.

votre action ressemblera

[Route("{id:int}")] 
     [UserAuth] 
     public ActionResult Select(int id) 
     { 
      return View(); 
     } 

Et dans votre classe d'attributs, vous pouvez obtenir des valeurs d'itinéraire.

public class UserAuthAttribute: AuthorizeAttribute 
    { 
     public int ProjectId { get; set; } 
     protected override bool AuthorizeCore(HttpContextBase contextBase) 
     { 
      var getRouteData =contextBase.Request.RequestContext.RouteData.Values["id"]; 
      if(getRouteData != null) 
      { 
       ProjectId = Int32.Parse(getRouteData.ToString()); 
      } 
      if(ProjectId > 5) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      }   
     } 
    }