Дружественные URL-адреса для ASP.NET

Рамки Python всегда предоставляют способы обработки URL-адресов, которые передают данные запроса элегантным способом, например, http://somewhere.overtherainbow.com/userid/123424/

Я хочу, чтобы вы заметили конечный путь / userid / 123424 /

Как вы это делаете в ASP.NET?

    В этом примере используется ASP.NET Routing для реализации дружественных URL-адресов.

    Примеры сопоставлений, которые обрабатываются приложением:

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

    В этом примере используются querystrings и избегает любых требований по модификации кода на странице aspx.

    Шаг 1 – добавьте необходимые записи в web.config

                

    Шаг 2 – добавьте таблицу маршрутизации в global.asax

    Определите отображение из дружественного URL-адреса на страницу aspx, сохранив запрошенный идентификатор пользователя для последующего использования.

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

    Шаг 3 – выполнить обработчик маршрута

    Добавьте запрос к текущему контексту до начала маршрутизации.

     using System.Web.Compilation; 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; } } 

    Код пользователя users.aspx

    Код на странице aspx для справки.

     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 = "Claire"; break; case "1236": lblUserId.Text = id; lblUserName.Text = "David"; break; default: lblUserId.Text = "0000"; lblUserName.Text = "Unknown"; break; } 

    Это альтернативный пример, который также использует ASP.NET Routing для реализации дружественных URL-адресов.

    Примеры сопоставлений, которые обрабатываются приложением:

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

    Этот пример не использует querystrings, но требует дополнительного кода на странице aspx.

    Шаг 1 – добавьте необходимые записи в web.config

                 

    Шаг 2 – добавьте таблицу маршрутизации в global.asax

    Определите отображение из дружественного URL-адреса на страницу aspx, сохранив запрошенный идентификатор пользователя для последующего использования.

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

    Шаг 3 – выполнить обработчик маршрута

    Передайте контекст маршрутизации, содержащий параметр, на страницу. (Обратите внимание на определение IRoutablePage)

     using System.Web.Compilation; 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; } } 

    Шаг 4 – Получить параметр на целевой странице

    Обратите внимание на выполнение 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 = "Claire"; 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 } 

    Вот еще один способ сделать это с помощью ASP.NET MVC

    Прежде всего, вот код controllerа с двумя действиями. Index получает список пользователей из модели, userid получает отдельного пользователя:

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

    Вот представление Index.asp, он использует ActionLink для создания ссылок в правильном формате:

     <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Index" %> <%@ Import Namespace="MvcApplication1.Controllers" %> <%@ Import Namespace="MvcApplication1.Models" %>       

    Index of Users

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

    И вот представление userid.aspx, в котором отображаются данные человека:

     <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="userid.aspx.cs" Inherits="MvcApplication1.Views.Users.userid" %> <%@ Import Namespace="MvcApplication1.Controllers" %> <%@ Import Namespace="MvcApplication1.Models" %>       
    ID <%=((User)ViewData.Model).id %>
    Name <%=((User)ViewData.Model).name %>

    И, наконец, для полноты, вот код модели:

     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="Claire"}, 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; } } } 

    Я использовал URL-адрес переписывания URL-адресов Intelligence:

    http://urlrewriter.net/

    Это было так легко настроить – может быть, час, чтобы все заработало. Очень мало проблем с этим …

    Я бы рекомендовал его, но я должен был упомянуть, что я не пробовал других.

    Удачи!

    Кроме того, проверьте ASP.NET MVC или, если вы настроены на веб-формы, новое пространство имен System.Web.Routing в ASP.NET 3.5 SP1

    Я разработал библиотеку NuGet с открытым исходным кодом для этой проблемы, которая неявно преобразует EveryMvc / Url в каждый-mvc / url.

    Пунктирные URL-адреса гораздо более дружественны к SEO и их легче читать. Более строгие URL-адреса, как правило, создают меньше проблем. ( Еще на моем блоге )

    Пакет NuGet: https://www.nuget.org/packages/LowercaseDashedRoute/

    Чтобы установить его, просто откройте окно NuGet в Visual Studio, щелкнув правой кнопкой мыши Project и выбрав NuGet Package Manager, а на вкладке «Онлайн» введите «Строчный пунктирный маршрут», и он должен появиться.

    Кроме того, этот код можно запустить в консоли диспетчера пакетов:

    Install-Package LowercaseDashedRoute

    После этого вы должны открыть App_Start / RouteConfig.cs и прокомментировать существующий вызов route.MapRoute (…) и добавить его вместо этого:

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

    Вот и все. Все URL-адреса строчные, пунктирные и конвертируются неявно, если вы ничего не делаете.

    URL-адрес проекта с открытым исходным кодом: https://github.com/AtaS/lowercase-dashed-route

    Давайте будем гением компьютера.