Быстрый ответ:
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)));
Достаточно много работы, чтобы избежать просто извлечения значения из данных маршрутизации.