Friendly URLs for ASP.NET

后端 未结 6 1091
旧时难觅i
旧时难觅i 2020-11-30 19:48

Python frameworks always provide ways to handle URLs that convey the data of the request in an elegant way, like for example http://somewhere.overtherainbow.com/userid/12342

6条回答
  •  悲&欢浪女
    2020-11-30 20:44

    This is an alternative example that also uses ASP.NET Routing to implement friendly URLs.

    Examples of the mappings that the application handles are:

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

    This example does not use querystrings but requires additional code on the aspx page.

    Step 1 - add the necessary entries to web.config

    
    
            
            
        
            
    
    
        
        
        
    
    

    Step 2 - add a routing table in global.asax

    Define the mapping from the friendly URL to the aspx page, saving the requested userid for later use.

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

    Step 3 - implement the route handler

    Pass the routing context, containing the parameter, to the page. (Note the definition of 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;
        }
    }
    

    Step 4 - Retrieve the parameter on the target page

    Note the implemetation of 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
    }
    

提交回复
热议问题