2012-01-06 1 views

Répondre

2

Exemple IRouteConstraint:

public class IsUserActionConstraint : IRouteConstraint 
{ 
    //This is a static variable that handles the list of users 
    private static List<string> _users; 


    //This constructor loads the list of users on the first call 
    public IsUserActionConstraint() 
    { 
     _users= (from u in Models.Users.Get() select u.Username.ToLower()).ToList(); 
    } 


    //Code for checking to see if the route is a username 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     return _users.Contains((values["username"] as string).ToLower()); 
    } 


} 

Et, pour enregistrer l'itinéraire dans le Global.asax:

routes.MapRoute(
      "User Profile", // Route name 
      "{username}", 
      new { controller = "User", action = "Index", id = UrlParameter.Optional },// This stuff is here for ASP.NET MVC 
    new { IsUserAction = new IsUserActionConstraint() } //Your IRouteconstraint 
     ); 

Dans mon cas, ma liste d'utilisateurs ne change jamais au cours du cycle de vie de l'application afin que je puisse Cachez-le en utilisant une liste statique. Je suggère que vous modifiez le code afin que vous fassiez ce que jamais vérifier pour vous assurer que la valeur entrée est un nom d'utilisateur à l'intérieur de la correspondance.

+0

Je n'ai pas encore testé cela parce que j'ai du mal à le convertir en asp.net new {IsUserAction = new IsUserActionConstraint()} – user516883

+0

Postez le bloc de code que vous utilisez pour enregistrer votre itinéraire et je vous donnerai vous un peu d'aide. new {} n'est qu'un objet ou un type anonyme, dans .NET 3.0 cette fonctionnalité a été introduite. Le côté gauche est juste un nom de variable et le côté droit crée une instance de la classe. Selon l'endroit où vous placez votre fichier de classe, vous devrez peut-être ajuster l'espace de noms de la classe, comme nouveau Path.To.Class.IsUserActionConstraint() –

+0

En utilisant asp.net 4.0. et ce paramètre attend bool checkphysicalUrlAddress: routeCollection.MapPageRoute ("RouteForUser", "{username}", "~/Userprofile.aspx", nouveau IsUserActionConstraint()); – user516883

1
rewriterule www.webdomain.com/.+? www.webdomain.com/page.aspx?usename=$1 
2

Utilisez le routage MVC. Ceci est un bon article sur la façon d'utiliser le routage avec mvc webforms:

http://msdn.microsoft.com/en-us/magazine/dd347546.aspx

et

http://msdn.microsoft.com/en-us/library/cc668177.aspx

+0

Bons exemples. Je suis maintenant capable de faire www.example.com/u/username. comment je me débarrasserais de/u et aurais juste/username, il me dit que le reroute ne peut pas commencer par/ – user516883

+0

Vous devrez enregistrer un itinéraire pour "{Username}" et je suggèrerais de créer un IRouteConstraint qui ferait respecter l'itinéraire ne correspond que lorsque la valeur entrée était un nom d'utilisateur. Voir http://stackoverflow.com/questions/4988138/how-to-make-irouteconstraint-filter-route ou http://stephenwalther.com/blog/archive/2008/08/07/asp-net-mvc-tip -30-create-custom-route-constraints.aspx –

+0

Y at-il de toute façon vous pouvez me montrer un exemple sous forme asp.net. J'ai la classe IRouteConstraint mais je ne sais pas trop comment l'utiliser. Merci – user516883

0

Il y a quelques façons de le faire. Vous pouvez utiliser ASP.NET MVC et créer une route en utilisant un IRouteConstraint pour vous assurer que le nom d'utilisateur existe.

Vous pouvez également créer un IHttpModule qui capture les demandes Application_BeginRequest et handel pour www.webdomain.com/username et ReWriting ou TransferRequest vers www.webdomain.com/page.aspx?usename=myusername.

Vous pouvez également faire le code directement dans Global.asax comme vous le feriez avec le IHttpModule.

Questions connexes