ASP.NET Routing для передачи строки запроса на страницу - PullRequest
2 голосов
/ 15 августа 2011

Я использую маршрутизацию ASP.NET для сопоставления URL-адресов с произвольным числом разделов на моем сайте.Все они будут обрабатываться на одной странице, хотя я хочу иметь разные URL.Например,

http://site.com/blog для моего blog раздела
http://site.com/mysection для mysection и т. Д.

Таких разделов может быть любое количество, но все они будут обработанына Lister.aspx.У меня также есть другая страница, которая обрабатывает контент, названная ContentView.aspx, которая демонстрирует контент.Мой маршрут выглядит следующим образом: (cats - это список категорий)

cats.ForEach(c =>
        {
            table.Add(new Route(c.ShortName, new PageRouteHandler("~/Lister.aspx?cat=" + c.ID), ));
            table.Add(new Route(c.ShortName + "/{id}", new PageRouteHandler("~/ContentView.aspx")));
            table.Add(new Route(c.ShortName + "/{id}/{title}", new PageRouteHandler("~/ContentView.aspx")));
        });

Допустим, у меня есть запись в блоге с идентификатором 123 и названием hello:
Пользователь может получить к нему доступ с помощью http://site.com/blog/123/hello
Они также могут использовать только идентификатор http://site.com/blog/123
Как вы можете догадаться, я хочу, чтобы http://site.com/blog указывал на страницу списка, а не на просмотрщик контента, и мне также нужен идентификатор категории, чтобы различать, какойкатегория (blog или mycategory или что-либо еще, что было создано динамически), я должен отобразить.Я пытаюсь передать идентификатор категории в строку запроса, вызывается страница списка, но без строки запроса.Почему это происходит, и как я могу отправить свой идентификатор категории на страницу списка?

1 Ответ

1 голос
/ 15 августа 2011

Я бы предложил создать свой собственный RouteHandler, который реализует IRouteHandler, который вы могли бы затем передать отдельному параметру в его конструктор (идентификатор категории).

Затем в GetHttpHandler вы могли бы передать этот идентификатор на страницу.используя HttpContext.

Что-то вроде:

public class CategoryRouteHandler : IRouteHandler 
{
   private string _virtualPath;
   private string _category;

   public CategoryRouteHandler(string virtualPath, string category)
   {
       _virtualPath = virtualPath;
       _category = category;
   }

   public IHttpHandler GetHttpHandler(RequestContext requestContext) 
   {
        var handler = BuildManager.CreateInstanceFromVirtualPath(
            _virtualPath, typeof(Page)) as IDefaultHttpHandler;

        HttpContext.Current.Items["Category"] = _category;

        return handler;
   }
} 

Тогда вы можете использовать:

table.Add(new Route(c.ShortName, new CategoryRouteHandler("~/Lister.aspx", c.ID), ));

И из кода Листера вы можете получить доступ HttpContext.Current.Items["Category"]

Редактировать : обновлено, чтобы исправить код, извините, я не тестировал его в первый раз.

...