URLs amigables para ASP.NET

Los marcos de Python siempre proporcionan formas de manejar las URL que transmiten los datos de la solicitud de una manera elegante, como por ejemplo http://somewhere.overtherainbow.com/userid/123424/

Quiero que notes la ruta final / userid / 123424 /

¿Cómo se hace esto en ASP.NET?

Este ejemplo utiliza el enrutamiento ASP.NET para implementar URL amigables.

Ejemplos de las asignaciones que maneja la aplicación son:

http: // samplesite / userid / 1234 – http: //samplesite/users.aspx? userid = 1234
http: // samplesite / userid / 1235 – http: //samplesite/users.aspx? userid = 1235

Este ejemplo usa cadenas de consulta y evita cualquier requisito para modificar el código en la página aspx.

Paso 1: agregue las entradas necesarias a web.config

            

Paso 2: agrega una tabla de enrutamiento en global.asax

Defina la asignación de la URL amigable a la página aspx, guardando el ID de usuario solicitado para su uso posterior.

 void Application_Start(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes); } public static void RegisterRoutes(RouteCollection routes) { routes.Add("UseridRoute", new Route ( "userid/{userid}", new CustomRouteHandler("~/users.aspx") )); } 

Paso 3: implementa el manejador de ruta

Agregue la cadena de consulta al contexto actual antes de que se lleve a cabo el enrutamiento.

 using System.Web.Comstacktion; using System.Web.UI; using System.Web; using System.Web.Routing; public class CustomRouteHandler : IRouteHandler { public CustomRouteHandler(string virtualPath) { this.VirtualPath = virtualPath; } public string VirtualPath { get; private set; } public IHttpHandler GetHttpHandler(RequestContext requestContext) { // Add the querystring to the URL in the current context string queryString = "?userid=" + requestContext.RouteData.Values["userid"]; HttpContext.Current.RewritePath( string.Concat( VirtualPath, queryString)); var page = BuildManager.CreateInstanceFromVirtualPath (VirtualPath, typeof(Page)) as IHttpHandler; return page; } } 

Código de users.aspx

El código en la página aspx para referencia.

 protected void Page_Load(object sender, EventArgs e) { string id = Page.Request.QueryString["userid"]; switch (id) { case "1234": lblUserId.Text = id; lblUserName.Text = "Bill"; break; case "1235": lblUserId.Text = id; lblUserName.Text = "Clair"; break; case "1236": lblUserId.Text = id; lblUserName.Text = "David"; break; default: lblUserId.Text = "0000"; lblUserName.Text = "Unknown"; break; } 

Este es un ejemplo alternativo que también utiliza el enrutamiento ASP.NET para implementar URL amigables.

Ejemplos de las asignaciones que maneja la aplicación son:

http: // samplesite / userid / 1234 – http: //samplesite/users.aspx? userid = 1234
http: // samplesite / userid / 1235 – http: //samplesite/users.aspx? userid = 1235

Este ejemplo no utiliza cadenas de caracteres sino que requiere código adicional en la página de aspx.

Paso 1: agregue las entradas necesarias a web.config

             

Paso 2: agrega una tabla de enrutamiento en global.asax

Defina la asignación de la URL amigable a la página aspx, guardando el ID de usuario solicitado para su uso posterior.

 void Application_Start(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes); } public static void RegisterRoutes(RouteCollection routes) { routes.Add("UseridRoute", new Route ( "userid/{userid}", new CustomRouteHandler("~/users.aspx") )); } 

Paso 3: implementa el manejador de ruta

Pase el contexto de enrutamiento, que contiene el parámetro, a la página. (Tenga en cuenta la definición de IRoutablePage)

 using System.Web.Comstacktion; using System.Web.UI; using System.Web; using System.Web.Routing; public interface IRoutablePage { RequestContext RequestContext { set; } } public class CustomRouteHandler : IRouteHandler { public CustomRouteHandler(string virtualPath) { this.VirtualPath = virtualPath; } public string VirtualPath { get; private set; } public IHttpHandler GetHttpHandler(RequestContext requestContext) { var page = BuildManager.CreateInstanceFromVirtualPath (VirtualPath, typeof(Page)) as IHttpHandler; if (page != null) { var routablePage = page as IRoutablePage; if (routablePage != null) routablePage.RequestContext = requestContext; } return page; } } 

Paso 4 – Recuperar el parámetro en la página de destino

Tenga en cuenta la implementación de IRoutablePage.

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Routing; public partial class users : System.Web.UI.Page, IRoutablePage { protected RequestContext requestContext; protected object RouteValue(string key) { return requestContext.RouteData.Values[key]; } protected void Page_Load(object sender, EventArgs e) { string id = RouteValue("userid").ToString(); switch (id) { case "1234": lblUserId.Text = id; lblUserName.Text = "Bill"; break; case "1235": lblUserId.Text = id; lblUserName.Text = "Clair"; break; case "1236": lblUserId.Text = id; lblUserName.Text = "David"; break; default: lblUserId.Text = "0000"; lblUserName.Text = "Unknown"; break; } } #region IRoutablePage Members public RequestContext RequestContext { set { requestContext = value; } } #endregion } 

Aquí hay otra forma de hacerlo usando ASP.NET MVC

Primero, aquí está el código del controlador con dos acciones. Index obtiene una lista de usuarios del modelo, userid obtiene un usuario individual:

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; namespace MvcApplication1.Controllers { public class UsersController : Controller { public ActionResult Index() { return View(Models.UserDB.GetUsers()); } public ActionResult userid(int id) { return View(Models.UserDB.GetUser(id)); } } } 

Aquí está la vista Index.asp, usa un ActionLink para crear enlaces en el formato correcto:

 < %@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Index" %> < %@ Import Namespace="MvcApplication1.Controllers" %> < %@ Import Namespace="MvcApplication1.Models" %> < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">      

Index of Users

    < % foreach (User user in (IEnumerable)ViewData.Model) { %>
  • < %= Html.ActionLink(user.name, "userid", new {id = user.id })%>
  • < % } %>

Y aquí está la vista userid.aspx que muestra los detalles de un individuo:

 < %@ Page Language="C#" AutoEventWireup="true" CodeBehind="userid.aspx.cs" Inherits="MvcApplication1.Views.Users.userid" %> < %@ Import Namespace="MvcApplication1.Controllers" %> < %@ Import Namespace="MvcApplication1.Models" %> < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">      
ID < %=((User)ViewData.Model).id %>
Name < %=((User)ViewData.Model).name %>

Y finalmente para completar, aquí está el código del modelo:

 using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcApplication1.Models { public class UserDB { private static List users = new List{ new User(){id=12345, name="Bill"}, new User(){id=12346, name="Clair"}, new User(){id=12347, name="David"} }; public static List GetUsers() { return users; } public static User GetUser(int id) { return users.First(user => user.id == id); } } public class User { public int id { get; set; } public string name { get; set; } } } 

He estado usando un reescritura de URL por Intelligencia:

http://urlrewriter.net/

Fue tan fácil de configurar, quizás una hora para ponerlo todo en funcionamiento. Muy pocos problemas con eso …

Lo recomendaría, pero debería mencionar que no he probado ninguno.

¡Buena suerte!

Además, consulte ASP.NET MVC o, si está configurado en formularios web, el nuevo espacio de nombres System.Web.Routing en ASP.NET 3.5 SP1.

Desarrollé una biblioteca de código abierto NuGet para este problema que implícitamente convierte EveryMvc / Url en cada mvc / url.

Las URL discontinuas son mucho más amigables con el SEO y más fáciles de leer. Las URL en minúsculas tienden a crear menos problemas. ( Más en mi blog )

Paquete NuGet: https://www.nuget.org/packages/LowercaseDashedRoute/

Para instalarlo, simplemente abra la ventana de NuGet en el Visual Studio haciendo clic con el botón derecho en el Proyecto y seleccionando Administrador de paquetes NuGet, y en la pestaña “En línea” escriba “Ruta discontinua en minúsculas”, y debería aparecer.

Alternativamente, puede ejecutar este código en la consola del Administrador de paquetes:

Install-Package LowercaseDashedRoute

Después de eso, debería abrir App_Start / RouteConfig.cs y comentar la ruta existente. LlameMapRoute (…) y agregue esto en su lugar:

 routes.Add(new LowercaseDashedRoute("{controller}/{action}/{id}", new RouteValueDictionary( new { controller = "Home", action = "Index", id = UrlParameter.Optional }), new DashedRouteHandler() ) ); 

Eso es. Todas las URL son minúsculas, discontinuas y se convierten implícitamente sin que usted haga nada más.

URL del proyecto de código abierto: https://github.com/AtaS/lowercase-dashed-route