ASP.net上的URL路由,需要从url获取参数

时间:2011-09-04 10:08:29

标签: asp.net url .net-3.5 routing

我正在开发asp.net应用程序的组功能。 我想让用户直接访问组,所以我希望网址是

www.<domain>.com/<groupname>

我为这种情况实现了URL路由,但是我想将组名称传递给asp页面作为参数的问题,我该怎么做?

实际路径为"~/Public/ViewGroup?group=<groupname>,如何获取此组名并将其添加到虚拟路径?

由于

2 个答案:

答案 0 :(得分:6)

快速回答是:

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

然后使用querystring来提取~/public/viewgroup代码中的值,而不是(或同样),而是从RouteData中提取组名,如下所示。

ControllerContext.RouteData.Values["groupname"];

另一个选项是使用IIS重写模块。

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

如果您确实必须将值作为新querystring值传递,并且想要使用路由,那么事情会变得棘手。实际上,您必须定义自定义处理程序并重写路径,以便将路由值附加到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);
    }
}

这可以注册如下:

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

要避免将值拉到路由数据上,需要做很多工作。

答案 1 :(得分:0)

ASP.NET MVC路径样式参数(参数)可以在C#控制器中访问,就像这样。要检索的路径参数是“id”,它返回值“123”。

MVC路由

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