Pergunta

Eu sei que no Framework MVC, você tem a classe Html para criar URLs:

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

Mas o que se deseja gerar URLs em Webforms?

Eu não encontrei um bom recurso sobre os detalhes sobre a geração de URLs com Webforms.

Por exemplo, se eu estou gerando rotas assim:

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

Como eu iria gerar URLs usando os dados da tabela de roteamento.

Como faço para gerar URLs com base em minhas rotas?

por exemplo. / Ca / en / artigos / 123 / Article-Title sem

Foi útil?

Solução

Como você diz, ASP.NET MVC oferece-lhe um conjunto de métodos auxiliares para "lookup reverso" do RouteTable e gerar uma URL para você. Eu não tenho jogado com isso muito ainda, mas tanto quanto eu posso ver que você precisa chamar o método GetVirtualPath em um RouteCollection (RouteTable.Routes mais provável). Então, algo como:

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

Você precisa passar o RequestContext e um RouteValueDictionary. O RouteValueDictionary contém os parâmetros da rota (assim no seu caso algo como condado = "UK", lang = "EN-GB" etc. A parte complicada é o RequestContext como este não é parte do normal de HttpContext. Você pode empurrá-lo para o HttpContext em sua IRouteHandler:

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

e, em seguida, restaurá-lo novamente em sua (página aspx) IHttpHandler quando necessário:

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

Desculpas para responder a uma pergunta C #, em VB, era apenas que o encaminhamento local ASP.NET eu tive que mão estava em VB.NET.

Outras dicas

Obrigado pelas respostas. Para acrescentar a isto, aqui está o que eu fiz:

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

Criar Url do artigo objeto

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 () retorna um nome URL amigável .

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

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

TaDa!

Hyperlink hl = new Hyperlink (); hl.Text = "clique aqui"; hl.NavigateUrl = "~ / Formas / Article.aspx"; MostlyAnyControl.Controls.Add (hl);

como para colocá-lo em uma lista ... ou (1) laço / iterate, ou (2) Linq para XML.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top