Маршрутизация .net 4.0 с помощью QueryStrings - PullRequest
3 голосов
/ 04 февраля 2012

Я понимаю, что существует множество статей и ресурсов на эту тему, но все, кажется, показывают только, как переместить строку запроса, такую ​​как category = shoes , вокруг URL-адреса в другое место, как это товары / {категория}

Ну, у меня есть следующая строка запроса: profile.aspx? Q = 98c2b15f-90c3-4a7f-a33f-0e34b106877e

Я пытался реализовать RoutHandler для запроса к БД, чтобы найти имя пользователя и создать URL, например mydomain.com / usersname

Это то, что я пытался (сейчас все жестко запрограммировано, пока я не заработаю) :

void Application_Start(object sender, EventArgs e)
{
    RegisterRoute(System.Web.Routing.RouteTable.Routes);
}

void RegisterRoute(System.Web.Routing.RouteCollection routes)
{
    routes.Add("Profiles", new System.Web.Routing.Route("profile/{profile}", new RouteHandler()));
}

А это класс обработчика:

public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
    string username = requestContext.RouteData.Values["profile"] as string;

    HttpContext.Current.Items["q"] = "98c2b15f-90c3-4a7f-a33f-0e34b106877e";
    return BuildManager.CreateInstanceFromVirtualPath("~/pub/profile.aspx", typeof(Page)) as Page;
}

Profile.aspx фактически ищет строку запроса "q". И с вышеупомянутой установкой, это не находит это.

Что я делаю не так? Как мне перенаправить или переписать URL, чтобы он был красивым + сохранить его, чтобы на странице можно было найти нужные ему строки запросов?

Любая помощь будет отличной. Заранее спасибо.

1 Ответ

0 голосов
/ 04 февраля 2012

Первое. Если вы используете .net framework 4, вам не нужно создавать какой-либо обработчик, вы можете напрямую использовать метод MapPageRoute для маршрута.

Ответ на ваш вопрос - используйте цикл foreach, как показано нижев обработчике, а не в поиске «профиля» специально.

    foreach (var urlParm in requestContext.RouteData.Values)
         requestContext.HttpContext.Items[urlParm.Key] = urlParm.Value;

    return BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler

и на вашей перенаправленной странице вы должны проверить

    string userName = this.Context.Items["profile"].ToString();       // "userName" and is set as route parameters in Global.asax

Вы установили VirtualPath в конструкторе RouteHandler

 RouteHandler(string virPath)
    {
        this.VirtualPath = virPath;
    }

см. Эти ссылки для получения дополнительной информации- http://www.codeproject.com/Articles/77199/URL-Routing-with-ASP-NET-4-0 http://msdn.microsoft.com/en-us/library/ie/cc668201.aspx

...