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

标签 asp.net url .net-3.5 routing

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

www.<domain>.com/<groupname>

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

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

谢谢

最佳答案

快速回答是使用:

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

避免仅将值提取到路由数据中需要做很多工作。

关于asp.net - ASP.net上的URL路由,需要从url中获取参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7298476/

相关文章:

c# - .NET 跟踪不适用于 Diagnostics.TraceSource,仅适用于 Diagnostics.Trace

asp.net-mvc - MVC 路由 Html.ActionLink 使用 ?id=1 而不是/id 创建 URL

url - 我应该在我的网页 url 路径中包含文件扩展名吗?

c# - SystemSounds.Beep.Play 不发出任何声音

c# - 编辑多级嵌套对象列表的正确方法

c# - 组合多个 Linq Where 语句

asp.net - 对 ASP.NET Web 应用程序进行版本控制

c# - 我需要开发一个 web 服务监控 .net 应用程序。设计这个的最佳方法是什么

c# - 从 aspx 站点请求另一个页面

javascript - 如何知道一个url是否在javascript中有参数