2010-08-18 4 views
2

J'ai configuré le routage webform sur mon projet asp.net webforms 3.5sp1. Je voudrais avoir les fichiers pour le site dans un répertoire appelé contenu, y compris la page d'accueil, car je voudrais exécuter plusieurs sites en utilisant le même système.Page d'accueil du routage Webform dans un dossier tel que mvc plutôt que la racine du site

Dans MVC, une page par défaut est vide et la page d'accueil se trouve dans un dossier appelé home. Je n'arrive pas à reproduire ce comportement en utilisant le routage de formulaire Web, mais j'aimerais le faire. La page blanche est toujours touchée en premier. le gestionnaire d'itinéraire est frappé en second - il reconnaît que la demande est pour la page d'accueil et configure la page de routage mais n'est pas utilisée. le code du gestionnaire d'itinéraire est simple:

public string VirtualPath { get; private set; } 

    public IHttpHandler GetHttpHandler(RequestContext 
      requestContext) 
    { 
     string file = requestContext.RouteData.GetRequiredString("File"); 
     string id = requestContext.RouteData.GetRequiredString("Id"); 
     string queryString = "?menuid=" + id; 
     VirtualPath = "~/" + file; 
     HttpContext.Current.RewritePath(
      string.Concat(
      VirtualPath, 
      queryString)); 

     var page = BuildManager.CreateInstanceFromVirtualPath 
      (VirtualPath, typeof(Page)) as IHttpHandler; 
     return page; 
    } 

Y at-il de toute façon que je peux le faire?

Mise à jour Voici mon global.asax Code de la route:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     Domain.RepositoryFactory repo = new RepositoryFactory(); 
     foreach (var x in repo.MenuRepository.GetAllEnabledGetMenus()) 
     { 
      if (string.IsNullOrEmpty(x.Url)) 
      { 
       //add default 
       System.Web.Routing.RouteTable.Routes.Add(
        new Route("Default.aspx", 
         new RouteValueDictionary(new { File = x.FileName, 
                 Id = x.Id.ToString() }), 
           new CoreRouteHandler())); 
      } 
      else 
      { 
       string url = x.Url; 
       if(x.Url.StartsWith("/")) 
       { 
        url = url.Remove(0, 1); 
       } 
       System.Web.Routing.RouteTable.Routes.Add(
        new System.Web.Routing.Route(url, 
         new RouteValueDictionary(new {File = x.FileName, 
                 Id = x.Id.ToString()}), 
          new CoreRouteHandler())); 
      } 

     } 

    } 
+0

Ne pensez pas que vous avez besoin du '~' pour le VirtualPath. S'il vous plaît montrer comment vous avez configuré vos itinéraires dans Global.asax? Le gestionnaire de routage doit toujours être touché en premier! – Markive

+0

J'ai ajouté le code global. Lorsque je parcours la page default.aspx, le chargement commence par le gestionnaire d'itinéraire. Toutes les autres pages itinéraire bien. –

+0

Si je supprime le ~ je reçois une erreur Le chemin virtuel relatif [x] n'est pas autorisé ici. –

Répondre

0

ok Je l'ai eu un peu de travail! moment.

J'ai trouvé ce lien en googler:

http://blog.ysatech.com/post/2010/07/11/ASP-NET-4-URL-Routing-Default-Page.aspx

tout ce que je devais faire était quitter la route vide et supprimez le fichier default.aspx de la racine du site.

J'ai également copié dans le system.webserver bis par défaut d'un nouveau projet MVC car je pense que ce que j'avais là n'était pas correct. Je suis en train de mettre à jour un ancien projet et je pense donc qu'il n'a pas été configuré à 100%. spécifiquement: était manquant.

0

Dans mon projet, je devais rediriger tous les appels comme www.site.com/MyPage à /Pages/MyPage.aspx. A été fait en utilisant HttpModule. Exemple de code ci-dessous:

public void Init(HttpApplication context) 
    { 
     context.BeginRequest += new EventHandler(context_BeginRequest); 
    } 

    void context_BeginRequest(object sender, EventArgs e) 
    { 
     HttpApplication app = sender as HttpApplication; 

     if (app.Context == null || app.Context.Response == null) 
      return; 

     String sourceUrl = String.Empty; 
     try 
     { 
      sourceUrl = app.Request.FilePath.TrimStart('/').TrimEnd('/').ToLower(); 
      if (global::MyProject.Global.UrlShortcuts.ContainsKey(sourceUrl)) 
      { 
       String newUrl = global::MyProject.Global.UrlShortcuts[sourceUrl]; 
       app.Context.RewritePath(newUrl, string.Empty, app.Request.QueryString.ToString(), false); 
           } 
      else 
      { 
      } 
     } 
     catch (Exception Ex) 
     { 
      // handle your exception here 
     } 
    } 

Le problème mineur est avec IIS hoster que je ne pouvais pas le configurer pour traiter toutes les requêtes en utilisant ASP.NET. J'ai donc dû créer des espaces vides pour les pages .aspx pour les pages (par exemple www.site.com/MyPage/default.aspx) créées dynamiquement au démarrage de l'application si elles sont exécutées sous IIS.

String server = Context.Request.ServerVariables["SERVER_SOFTWARE"]; 
// IIS puts some stuff here, WebDev server leaves the field empty 
+0

merci pour votre réponse, j'aurais pu le faire comme ça mais il n'utilise pas le routage webform que je voulais utiliser. –