我正在开发 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/