Как использовать System.Web.Routing, чтобы не перезаписывать URL-адреса в веб-формах? - PullRequest
0 голосов
/ 12 января 2010

Я использую System.Web.Routing с веб-формами ASP.NET (3.5), которые будут перезаписывать URL-адрес следующего URL-адреса из

до

Код следующий:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.Add("CampaignRoute", new Route
                                    (
                                    "{campaign_code}",
                                    new CustomRouteHandler("~/default.aspx")
                                    ));
}

Реализация IRouteHandler:

public class CustomRouteHandler : IRouteHandler
{
    public CustomRouteHandler(string virtualPath)
    {
        VirtualPath = virtualPath;
    }

    public string VirtualPath { get; private set; }

    public IHttpHandler GetHttpHandler(RequestContext
          requestContext)
    {
        if (requestContext.RouteData.Values.ContainsKey("campaign_code"))
        {
            var code = requestContext.RouteData.Values["campaign_code"].ToString();

            HttpContext.Current.RewritePath(
                string.Concat(
                    VirtualPath,
                    "?campaign=" + code));
        }

        var page = BuildManager.CreateInstanceFromVirtualPath
                       (VirtualPath, typeof(Page)) as IHttpHandler;

        return page;
    }

Однако я заметил, что на моих существующих страницах aspx слишком много изменений (т.е. ссылки на javascript, ссылки на css-файлы).

  1. Так что я думаю, если есть способ сохранить вышеуказанный код, но в конце, а не переписать, просто выполните Request.Redirect или Server.Transfer, чтобы минимизировать необходимые изменения. Таким образом, цель использования System.Web.Routing становится исключительно удобной для URL для первой записи.

  2. Как игнорировать остальные шаблоны, кроме указанных в коде?

Спасибо.

1 Ответ

1 голос
/ 12 января 2010

Использование перезаписи в сочетании с маршрутизацией URL-адресов ASP.NET не рекомендуется, поскольку некоторые реализации маршрутизации URL-адресов ASP.NET также используют внутреннюю перезапись (это зависит от версии ASP.NET).Комбинация двух разных компонентов с использованием перезаписи может вызвать конфликты (хотя я не уверен на 100%, что именно поэтому вы видите эту проблему).

Относительно использования переноса / перенаправления / перезаписи:

Моя самая сильная рекомендация - не использовать ни один из них!Вместо перенаправления (или чего-либо еще) просто позвольте странице вызываться непосредственно ASP.NET, возвращая ее из IRouteHandler, почти так же, как вы уже делаете (просто без вызова Rewrite).Пока ваш IRouteHandler сохраняет RouteData где-то, Страница может затем получать данные из маршрута, и вы должны быть в порядке.

Взгляните на Маршрутизация веб-формы Фила ХаакаПример , чтобы увидеть пример того, как сохранить данные маршрута (или просто использовать его код!).

Относительно игнорирования шаблонов:

Вы можете использовать IRouteConstraint, чтобы ограничить, какие URL соответствуютваш маршрут.Существует встроенная реализация ограничения маршрута по умолчанию, которая использует регулярные выражения, но вы также можете написать собственные ограничения маршрута.Вот пример:

Route r = new Route(...);
r.Constraints = new RouteValueDictionary(new {
    campaign_code = "\d{5}", // constrain to 5-digit numbers only
    other_value = new CustomRouteConstraint(), // call custom constraint
});

CustomRouteConstraint - это класс, который вы можете написать, который наследуется от IRouteConstraint.

Одна вещь, которую я должен отметить о статических файлах, таких какпоскольку файлы CSS и JPG таковы, что по умолчанию они всегда исключаются из маршрутизации.По умолчанию маршрутизация игнорирует шаблоны, которые точно соответствуют физическим файлам на диске.Вы можете изменить это поведение, установив RouteTable.Routes.RouteExistingFiles = true, но это не значение по умолчанию.

...