Маршрутизация URL на ASP.net, необходимо получить параметр из URL - PullRequest
5 голосов
/ 04 сентября 2011

Я разрабатываю групповую функцию в приложении asp.net. Я хочу предоставить пользователям прямой доступ к группам, поэтому я хочу, чтобы URL был

www.<domain>.com/<groupname>

Я реализовал URL Routing для этого случая, но проблема в том, что я хочу передать имя группы на страницу asp в качестве параметра, как я могу это сделать?

фактический путь "~/Public/ViewGroup?group=<groupname>, как получить имя этой группы и добавить его в виртуальный путь?

Спасибо

Ответы [ 2 ]

6 голосов
/ 04 сентября 2011

Быстрый ответ:

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

Достаточно много работы, чтобы избежать просто извлечения значения из данных маршрутизации.

0 голосов
/ 31 июля 2013

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