2011-09-04 14 views
5

Sto sviluppando la funzione di gruppo nell'applicazione asp.net. Voglio dare agli utenti un accesso diretto a gruppi, quindi voglio l'URL daRouting URL su ASP.net, è necessario ottenere un parametro dall'URL

www.<domain>.com/<groupname> 

ho implementato URL Routing per questo caso, ma il problema che voglio passare il nome del gruppo una alla pagina ASP come parametro , Come lo posso fare?

il percorso attuale è "~/Public/ViewGroup?group=<groupname>, come ottenere questo nome di gruppo e aggiungerlo al percorso virtuale?

Grazie

+0

ho provato, ha lavorato sul server locale, ma in produzione non. –

+0

Ha funzionato sulla produzione; dopo l'aggiunta di questi per web.config < moduli runAllManagedModulesForAllRequests = "true">

+0

Aggiungere l'ultima configurazione più la configurazione sul sistema.web

risposta

5

La risposta più immediata è l'uso:

routes.MapPageRoute(
    "groupname", 
    "{group}", 
    "~/public/viewgroup" 
); 

E allora invece di (o oltre) utilizzando querystring per estrarre il valore in ~/public/viewgroup codice, si sarebbe invece estrarre il GROUPNAME da RouteData come segue.

ControllerContext.RouteData.Values["groupname"]; 

L'altra opzione è utilizzare il modulo di riscrittura di IIS.

<rewrite> 
    <rules> 
     <rule name="groupname"> 
      <match url="^([^/]*)$" /> 
      <action type="Rewrite" url="public/viewgroup?group={R:1}" /> 
     </rule> 
    </rules> 
</rewrite> 

Se davvero necessario passare il valore come nuovo valore querystring, e si vuole utilizzare Routing, allora le cose si fanno difficili. In realtà devi definire un gestore personalizzato e riscrivere il percorso per aggiungere i valori di routing a querystring.

public class RouteWithQueryHandler : PageRouteHandler 
{ 
    public RouteWithQueryHandler(string virtualPath, bool checkPhysicalUrlAccess) 
     : base(virtualPath, checkPhysicalUrlAccess) 
    { 
    } 

    public RouteWithQueryHandler(string virtualPath) 
     :base(virtualPath) 
    { 
    } 

    public override IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     var request = requestContext.HttpContext.Request; 
     var query = HttpUtility.ParseQueryString(request.Url.Query); 
     foreach (var keyPair in requestContext.RouteData.Values) 
     { 
      query[HttpUtility.UrlEncode(keyPair.Key)] = HttpUtility.UrlEncode(
               Convert.ToString(keyPair.Value)); 
     } 
     var qs = string.Join("&", query); 
     requestContext.HttpContext.RewritePath(
          requestContext.HttpContext.Request.Path, null, qs); 
     return base.GetHttpHandler(requestContext); 
    } 
} 

Questo può essere registrato come segue:

routes.Add("groupname", new Route("{groupname}/products.aspx",  
      new RouteWithQueryHandler("~/products.aspx", true))); 

E 'un bel po' di lavoro per evitare solo tirando fuori il valore ai dati di routing.

+0

sto usando. net 3.5, quindi sto usando il metodo Map.add r outes.Add (new Route ("{groupname}", new GroupRouteHandler ("~/Public/ViewGroup? group = {groupname}") )); mi ha dato questo errore: ~/Public/ViewGroup? Group = {groupname} 'non è un percorso virtuale valido –

+0

Scusate il mio male? non è consentito, è possibile utilizzare una regola di riscrittura. – TheCodeKing

+0

Puoi farlo anche con il routing, cercando di trovare il giusto sytnax. – TheCodeKing

0

ASP.NET Gli argomenti di percorso del percorso MVC (parametri) sono accessibili nel controller C# in questo modo. L'argomento del percorso da recuperare è "id" che restituisce un valore di "123".

MVC routing

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { id = RouteParameter.Optional }); 
} 

//Test URL: http://localhost/MyProject/Test/GetMyId/123 

MyController.cs

public class TestController : Controller 
{ 
    public string GetMyId() 
    { 
     //ANSWER -> ControllerContext.RouteData.Values["id"] 
     return ControllerContext.RouteData.Values["id"].ToString(); 
    } 
}