Создайте URL-адрес с маршрутизацией URL-адресов в Webforms

StackOverflow https://stackoverflow.com/questions/279779

  •  07-07-2019
  •  | 
  •  

Вопрос

Я знаю, что в MVC Framework у вас есть класс Html для создания URL-адресов:

Html.ActionLink("About us", "about", "home");

Но что, если вы хотите сгенерировать URL-адреса в Webforms?

Я не нашел действительно хорошего ресурса с подробными сведениями о создании URL-адресов с помощью Webforms.

Например, если я генерирую маршруты следующим образом:

Route r = new Route("{country}/{lang}/articles/{id}/{title}",
                  new ArticleRouteHandler("~/Forms/Article.aspx"));
Route r2 = new Route("{country}/{lang}/articles/",
                  new ArticleRouteHandler("~/Forms/ArticlesList.aspx"));

Routes.Add(r);
Routes.Add(r2);

Как бы я сгенерировал URL-адреса, используя данные таблицы маршрутизации.

Как мне сгенерировать URL-адреса на основе моих маршрутов?

например./ca/ru/статьи/123/Названиестатьи без

Это было полезно?

Решение

Как вы говорите, ASP.NET MVC предлагает вам набор вспомогательных методов для "обратного поиска" таблицы маршрутизации и генерации URL-адреса для вас.Я еще не много играл с этим, но, насколько я вижу, вам нужно вызвать метод GetVirtualPath для RouteCollection (скорее всего, RouteTable.Маршруты).Так что что-то вроде:

Dim routedurl = RouteTable.Routes.GetVirtualPath(context, rvd).VirtualPath

Вам нужно передать RequestContext и RouteValueDictionary.RouteValueDictionary содержит параметры маршрута (так что в вашем случае что-то вроде county ="UK", lang = "EN-GB" и т.д.Сложная часть - это RequestContext, поскольку это не является частью обычного HttpContext .Вы можете вставить его в HttpContext в вашем IRouteHandler:

requestContext.HttpContext.Items("RequestContext") = requestContext

а затем восстановите его снова в вашем IHttpHandler (aspx-страница), когда потребуется:

Dim rvd = 
  New RouteValueDictionary(New With {.country = "UK", .lang = "EN-GB"})
Dim routedurl = 
  RouteTable.Routes.GetVirtualPath(context.Items("RequestContext"), rvd).VirtualPath

Извиняюсь за ответ на вопрос C # в VB, просто дело было в том, что ASP.NET сайт маршрутизации, который я должен был передать, был в VB.NET.

Другие советы

Спасибо за ответы.ЧТОБЫ добавить к этому, вот что я сделал:

В Global.asax

RouteValueDictionary rvdSiteDefaults 
    = new RouteValueDictionary { { "country", "ca" }, { "lang", "en" } };

Route oneArticle 
    = new Route("{country}/{lang}/articles/a{id}/{title}",
        rvdSiteDefaults,
        rvdConstrainID,
        new ArticleRouteHandler("~/Articles/Details.aspx"));

Routes.Add( "Article", oneArticle);       

Создать URL-адрес из объекта Article

public static string CreateUrl(Article a) {
    // Note, Article comes from Database, has properties of ArticleID, Title, etc.
    RouteValueDictionary parameters;

    string routeName = "Article"; // Set in Global.asax

    parameters 
      = new RouteValueDictionary { 
         { "id", a.ArticleID }, 
         { "title", a.Title.CleanUrl() } 
        }; 

CleanUrl() Чистый завиток() возвращает понятное для URL-адреса имя.

    VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(null, routeName, parameters);

    string url = vpd.VirtualPath; 
    return url; // eg. /ca/en/1/The-Article-Title
}

TaDa!

Гиперссылка hl = новая гиперссылка();hl.Text = "нажмите здесь";hl.NavigateUrl="~/Forms/Article.aspx";В основном Anycontrol.Элементы управления.Добавить (hl);

что касается внесения этого в список...либо (1) цикл / итерация, либо (2) Linq в XML.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top