Câu trả lời nhanh chóng là sử dụng:
routes.MapPageRoute(
"groupname",
"{group}",
"~/public/viewgroup"
);
Và sau đó thay vì (hoặc cũng như) sử dụng querystring
để trích xuất các giá trị trong ~/public/viewgroup
mã, bạn sẽ thay trích xuất các groupname từ RouteData
như sau.
ControllerContext.RouteData.Values["groupname"];
Tùy chọn khác là sử dụng mô-đun viết lại IIS.
<rewrite>
<rules>
<rule name="groupname">
<match url="^([^/]*)$" />
<action type="Rewrite" url="public/viewgroup?group={R:1}" />
</rule>
</rules>
</rewrite>
Nếu bạn thực sự phải vượt qua giá trị như một giá trị mới querystring
, và muốn sử dụng Routing, sau đó mọi thứ trở nên khó khăn. Bạn thực sự phải xác định một trình xử lý tùy chỉnh và viết lại đường dẫn để nối thêm các giá trị định tuyến vào 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);
}
}
này có thể được đăng ký như sau:
routes.Add("groupname", new Route("{groupname}/products.aspx",
new RouteWithQueryHandler("~/products.aspx", true)));
Đó là khá nhiều công việc để tránh chỉ kéo giá trị ra các dữ liệu định tuyến.
Tôi đã thử nó, làm việc trên máy chủ của địa phương nhưng trong sản xuất không. –
Nó hoạt động trên sản xuất; sau khi thêm chúng vào web.config –
Thêm cấu hình cuối cùng cộng với cấu hình trên hệ thống.web biên soạn> httpModules> –