2010-10-30 5 views
0

Peut-être que je suis à la recherche de la mauvaise chose ou que j'essaie de l'appliquer de la mauvaise façon. Je génère dynamiquement une image à l'aide d'un gestionnaire générique. Je peux accéder actuellement mon gestionnaire en utilisant:C# Gestionnaire de routage générique ASP.NET MVC2

ImageHandler.ashx?width=x&height=y 

Je préférerais accéder à mon gestionnaire en utilisant quelque chose comme

images/width/height/imagehandler 

Est-ce possible les quelques exemples que j'ai trouvé sur Google ne fonctionne pas avec MVC2.

Cheers.

Répondre

5

J'ai continué à travailler sur ce problème hier soir et à ma grande surprise j'étais plus proche de la solution que j'avais imaginée. Pour ceux qui pourraient avoir des difficultés avec cela à l'avenir voici comment j'ai implémenté le routage MVC2 dans un gestionnaire générique.

D'abord, je créé une classe qui a hérité IRouteHandler

public class ImageHandlerRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     var handler = new ImageHandler(); 
     handler.ProcessRequest(requestContext); 

     return handler; 
    } 
} 

Je puis mis en œuvre le gestionnaire générique créer un MVC convivial ProcessRequest.

public void ProcessRequest(RequestContext requestContext) 
{ 
    var response = requestContext.HttpContext.Response; 
    var request = requestContext.HttpContext.Request; 

    int width = 100; 
    if(requestContext.RouteData.Values["width"] != null) 
    { 
     width = int.Parse(requestContext.RouteData.Values["width"].ToString()); 
    } 

    ... 

    response.ContentType = "image/png"; 
    response.BinaryWrite(buffer); 
    response.Flush(); 
} 

ensuite ajouté une route vers le global.asax

RouteTable.Routes.Add(
    new Route(
     "images/{width}/{height}/imagehandler.png", 
     new ImageShadowRouteHandler() 
    ) 
); 

vous pouvez appeler votre gestionnaire en utilisant

<img src="/images/100/140/imagehandler.png" /> 

J'ai utilisé le gestionnaire générique pour générer des filigranes dynamiques en cas de besoin. Espérons que cela aide les autres.

Si vous avez des questions faites le moi savoir et je vais essayer de vous aider dans la mesure du possible.

+0

Fantastique. Cela a fonctionné pour moi. La seule chose est, dans votre code ajouté à Global.asax vous mentionnez ImageShadowRouteHandler quand il devrait être ImageHandlerRouteHandler – wozza

+0

Solution vraiment sympa. Je l'ai aimé que je n'ai pas besoin de gérer le code d'un gestionnaire hérité pour les contrôleurs. –

0

J'utilise cette solution depuis longtemps maintenant, vous pouvez il sera plus générique afin d'accepter tout gestionnaire que vous aurez dans l'avenir:

internal class RouteGenericHandler<T> : IRouteHandler where T : IHttpHandler, new() 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return new T(); 
    } 
} 

Et sur la méthode RegisterRoutes:

routes.Add(new Route("Name", new RouteGenericHandler<TestHandler>()));