c# - routeconfig - Generar una URL con enrutamiento de URL en Webforms
ruteo mvc (3)
Sé que en MVC Framework tienes la clase Html para crear URL:
Html.ActionLink("About us", "about", "home");
Pero, ¿y si quieres generar URL en Webforms?
No he encontrado un recurso realmente bueno sobre los detalles sobre la generación de URL con Webforms.
Por ejemplo, si estoy generando rutas como esta:
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);
¿Cómo generaría URL utilizando los datos de la tabla de Enrutamiento?
¿Cómo genero URLs basado en mis rutas?
p.ej. / ca / es / articles / 123 / Article-Title sin
Como dices, ASP.NET MVC te ofrece un conjunto de métodos de ayuda para "buscar de forma inversa" el RouteTable y generar una URL para ti. Todavía no he jugado mucho pero, por lo que puedo ver, debes llamar al método GetVirtualPath en una RouteCollection (probablemente RouteTable.Routes). Entonces algo así como:
Dim routedurl = RouteTable.Routes.GetVirtualPath(context, rvd).VirtualPath
Debe pasar el RequestContext y un RouteValueDictionary. El RouteValueDictionary contiene los parámetros de ruta (por lo que en su caso algo como county = "UK", lang = "EN-GB" etc.). La parte difícil es RequestContext ya que no es parte del HttpContext normal. Puede insertarlo en el HttpContext en su IRouteHandler:
requestContext.HttpContext.Items("RequestContext") = requestContext
y luego restaurarlo de nuevo en su IHttpHandler (página aspx) cuando sea necesario:
Dim rvd =
New RouteValueDictionary(New With {.country = "UK", .lang = "EN-GB"})
Dim routedurl =
RouteTable.Routes.GetVirtualPath(context.Items("RequestContext"), rvd).VirtualPath
Disculpas por responder a una pregunta de C # en VB, era solo que el sitio de enrutamiento ASP.NET que tenía a mano estaba en VB.NET.
Hipervínculo hl = nuevo Hipervínculo (); hl.Text = "haga clic aquí"; hl.NavigateUrl = "~ / Forms / Article.aspx"; MostlyAnyControl.Controls.Add (hl);
en cuanto a ponerlo en una lista ... ya sea (1) loop / iterate, o (2) Linq a XML.
Gracias por las respuestas. Para agregar a esto, esto es lo que hice:
En 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);
Crear URL desde el objeto Artículo
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 () devuelve un nombre URL Friendly .
VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(null, routeName, parameters);
string url = vpd.VirtualPath;
return url; // eg. /ca/en/1/The-Article-Title
}
TaDa!