2011-09-04 9 views
5

Estoy desarrollando una función de grupo en la aplicación asp.net. Quiero dar a los usuarios el acceso directo a los grupos, por lo que quieren que la URL que seEnrutamiento de URL en ASP.net, necesita obtener un parámetro de la url

www.<domain>.com/<groupname> 

he implementado URL de enrutamiento para este caso, pero el problema que quiero pasar el nombre de grupo de una a la página ASP como parámetro , ¿Cómo puedo hacer eso?

la ruta real es "~/Public/ViewGroup?group=<groupname>, cómo obtener este nombre de grupo y agregarlo a la ruta virtual?

Gracias

+0

que lo han probado, trabajaron en el servidor local, pero no en la producción. –

+0

Funcionó en producción; después de agregarlos a web.config

+0

Agregue la última configuración más la configuración del sistema.Web

Respuesta

5

La respuesta rápida es el uso:

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

Y entonces, en lugar de (o además de) usando querystring para extraer el valor de ~/public/viewgroup código, que sería en lugar de extraer el nombre de grupo de RouteData como sigue.

ControllerContext.RouteData.Values["groupname"]; 

La otra opción es utilizar el módulo de reescritura de IIS.

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

Si realmente debe pasar el valor como un nuevo valor querystring, y desea utilizar enrutamiento, entonces las cosas se ponen difíciles. De hecho, debe definir un controlador personalizado y volver a escribir la ruta para agregar los valores de enrutamiento al 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); 
    } 
} 

Esto puede ser registrado como sigue:

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

Es un buen montón de trabajo para evitar simplemente tirando del valor a partir de los datos de enrutamiento.

+0

que estoy usando. net 3.5, entonces estoy usando el método Map.add r outes.Add (nueva ruta ("{groupname}", nueva GroupRouteHandler ("~/Public/ViewGroup? group = {groupname}") )); me dio este error: ~/Public/ViewGroup? Group = {groupname} 'no es una ruta virtual válida –

+0

Lo siento, ¿es malo? no está permitido, puede usar una regla de reescritura. – TheCodeKing

+0

Usted puede esto con el enrutamiento también, tratando de encontrar el sytnax correcto. – TheCodeKing

0

Se puede acceder a los argumentos (parámetros) del estilo de ruta de ASP.NET MVC de esta forma. El argumento de ruta que se recuperará es "id", que devuelve un valor de "123".

MVC enrutamiento

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(); 
    } 
} 
Cuestiones relacionadas