2009-02-03 7 views
1

J'ai le modèle Utilisateur/{domaine}/{nom d'utilisateur} mis en place via le routage. Tout fonctionne sauf pour une chose. Je n'arrive pas à comprendre comment transmettre les variables de domaine et de nom d'utilisateur à ma page redirigée. Voici ma méthode GetHttpHandler de mon implémentation IRouteHandler.System.Web.Routing avec WebForms - ramasser des variables dans la page cible

public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     string basePath; 
     basePath = "~/UserPage.aspx"; 
     string domain = requestContext.RouteData.GetRequiredString("domain"); 
     string username = requestContext.RouteData.GetRequiredString("username"); 

     string virtualPath = 
      string.Format(basePath + "?domain={0}&username={1}", domain, username); 
     return (Page)BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page)); 

    } 

je reçois l'erreur de la dernière ligne de code: UserPage.aspx domain = undomaine & nom d'utilisateur = someuser est pas un chemin d'accès virtuel valide.

Alors, comment êtes-vous censé transmettre des variables à la page cible? Qu'est-ce que je rate?

Répondre

1

Je pense que j'ai résolu celui-ci moi-même. boucle à cet

foreach (KeyValuePair<string, object> token in requestContext.RouteData.Values) 
    {     
     requestContext.HttpContext.Items.Add(token.Key, token.Value); 
    } 

de http://www.codethinked.com/post/2008/08/20/Exploring-SystemWebRouting.aspx est comme le 4ème exemple de code vers le bas.

MISE À JOUR:
Je ne sais pas si cela va fonctionner ... requestContext.HttpContext semble être "lecture seule". Retour à la planche à dessin.

MISE À JOUR 2:
On dirait que cela fonctionnera si vous ajoutez une référence à System.Web.Abstractions

1

Commencé bidouiller avec les choses et vu l'interface IHttpHandler fournit la RequestContext la méthode GetHttpHandler. Donc, j'ai modifié ma classe de page de base (j'ai toujours mis une couche entre System.Web.UI.Page et mes propres pages, en l'appelant BasePage ou similaire juste pour le but). J'ai donc ajouté une propriété publique sur PVBasePage pour recevoir un objet RequestContext.

public RequestContext RequestContext { get; set; } 

Ensuite, mon code de classe de routage est la suivante:

IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext) 
{ 
    // create the page object as my own page... 
    var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath 
     , typeof(PVBasePage)) as PVBasePage; 
    // pass in the request context 
    page.RequestContext = requestContext; 
    // return this page in the form of a IHttpHandler 
    return page as IHttpHandler; 
} 

Ainsi, au lieu de, comme dans l'exemple de code, création de l'instance directement comme IHttpHandler, je crée comme ma propre page. Définissez la propriété de contexte de demande, puis renvoyez la page à l'appelant AS IHttpHandler.

Testé et cela fonctionne. WOO HOO! Ensuite, dans la page d'instance, vous pouvez cliquer sur la collection RequestContext.GetValues ​​pour lire vos paramètres passés.

HTH

1

@ B.Tyndall

Je viens de recevoir ce travail avec une solution similaire à la vôtre.

trouvé à: http://msmvps.com/blogs/luisabreu/archive/2008/03/12/using-the-routing-mvc-api-with-classic-asp-net.aspx

foreach (var aux in requestContext.RouteData.Values) 
{ 
    HttpContext.Current.Items[aux.Key] = aux.Value; 
} 

Donc, en effet, vous n'utilisez plus le Request.QueryString mais le contexte.Articles collection

HttpContext.Current.Items["RouteName"] 

ou

Context.Items["RouteName"] 
1

Il semble que d'autres prennent également la route (sans jeu de mots) de mettre les paramètres dans le contexte collection Items.

http://bbits.co.uk/blog/archive/2008/05/19/using-asp.net-routing-independent-of-mvc---passing-parameters-to.aspx

je combine deux de ces approches pour les pages qui ont un paramètre spécifique, je créé un UserNameRouteHandler pour les pages qui acceptent ce type de paramètre. Dans ma classe PageBase, j'ai vérifié les éléments de contexte pour ce paramètre, puis défini une propriété afin que mes pages qui héritent de PageBase puissent l'utiliser.

public class UserNameRouteHandler : IRouteHandler 
{ 
    #region Implementation of IRouteHandler 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     string pageName = requestContext.RouteData.GetRequiredString("PageName"); 

     string employeeUserName = requestContext.RouteData.GetRequiredString("UserName"); 

     if(!string.IsNullOrEmpty(employeeUserName)) 
     { 
      requestContext.HttpContext.Items["UserName"] = employeeUserName; 
     } 

     pageName = pageName.ToLower() == "home" ? "default" : pageName; 

     string virtualPath = string.Format("~/{0}.aspx", pageName); 

     return (Page)BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page)); 

    } 

    #endregion 
} 

Et dans mon OnLoad PageBase je mis la propriété aux pages qui en ont besoin peut avoir ... certainement pour la recherche d'une solution plus élégante cependant.

protected override void OnLoad(EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     if (Context.Items["UserName"] != null) 
     { 
      EmployeeUserName = Context.Items["UserName"].ToString(); 
     } 
    } 

    base.OnLoad(e); 
} 
Questions connexes