加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 07:03:56 所属栏目:asp.Net 来源:网络整理
导读:我正在开发asp.net应用程序的组功能. 我想让用户直接访问组,所以我想要网址 www.domain.com/groupname 我为这种情况实现了URL路由,但是我想将组名称传递给asp页面作为参数的问题,我该怎么做? 实际路径是“?/ Public / ViewGroup?group = groupnamegt ;,如
我正在开发asp.net应用程序的组功能.
我想让用户直接访问组,所以我想要网址

www.<domain>.com/<groupname>

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

实际路径是“?/ Public / ViewGroup?group =< groupname&gt ;,如何获取此组名并将其添加到虚拟路径? 谢谢

解决方法

快速回答是使用:

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

然后使用查询字符串来提取?/ 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>

如果你真的必须将值作为新的查询字符串值传递,并且想要使用路由,那么事情会变得棘手.实际上,您必须定义自定义处理程序并重写路径,以便将路由值附加到查询字符串.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读