我正在开发asp.net应用程序的组功能。 我想让用户直接访问组,所以我希望网址是
www.<domain>.com/<groupname>
我为这种情况实现了URL路由,但是我想将组名称传递给asp页面作为参数的问题,我该怎么做?
实际路径为"~/Public/ViewGroup?group=<groupname>
,如何获取此组名并将其添加到虚拟路径?
由于
答案 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();
}
}