ASP.NET MVC to ignore “.html” at the end of all url

后端 未结 7 650
心在旅途
心在旅途 2021-01-04 18:52

I am new to asp.net mvc and now struggling with url routing. I\'m using asp.net mvc 3 RC2.

How can I create a url routing that IGNORES the very end

7条回答
  •  心在旅途
    2021-01-04 19:44

    I started to work on this question as a weekend assignment :D
    below code will work as requested in question. please refer below references

    1] MyUrlRoute Class : RouteBase

    using System; 
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    
    namespace MvcIgnoreUrl
    {
        #region //References    
        // SO question /http://stackoverflow.com/questions/4449449/asp-net-mvc-to-ignore-html-at-the-end-of-all-url       
        // Implementing Custom Base entry - Pro Asp.Net MVc Framework       
        //- http://books.google.com/books?id=tD3FfFcnJxYC&pg=PA251&lpg=PA251&dq=.net+RouteBase&source=bl&ots=IQhFwmGOVw&sig=0TgcFFgWyFRVpXgfGY1dIUc0VX4&hl=en&ei=z61UTMKwF4aWsgPHs7XbAg&sa=X&oi=book_result&ct=result&resnum=6&ved=0CC4Q6AEwBQ#v=onepage&q=.net%20RouteBase&f=false       
        // SO previous Question on ihttphandler - http://stackoverflow.com/questions/3359816/can-asp-net-routing-be-used-to-create-clean-urls-for-ashx-ihttphander-handle    
        // phil haack's Route Debugger http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx    
    
        #endregion
    
    
    public class MyUrlRoute : RouteBase
    {
    
        public override RouteData GetRouteData(HttpContextBase httpContext)
        {
            //~/Account/LogOn 
            //~/Home.aspx - Works fine
            //~/home/index.aspx  -Works Fine
            //http://localhost:57282/home/index/1/2/3 - Works fine
            //http://localhost:57282/Account/Register  http://localhost:57282/Account/LogOn - Works Fine
    
            string url = httpContext.Request.AppRelativeCurrentExecutionFilePath;
    
            //check null for URL
            const string defaultcontrollername  = "Home";
            string[] spliturl = url.Split("//".ToCharArray());
            string controllername = String.Empty;
            string actionname = "Index";
    
    
    
            if (spliturl.Length == 2) //for ~/home.aspx and ~/ 
            {
                if (String.IsNullOrEmpty(spliturl[1])) //TODO:  http://localhost:57282/ not working - to make it working
                {
                    controllername = defaultcontrollername;
                }
                else
                {
                    controllername = spliturl[1];
                    if (controllername.Contains("."))
                    {
                        controllername = controllername.Substring(0, controllername.LastIndexOf("."));
                    }
                }
            }
            else if (spliturl.Length == 3) // For #/home/index.aspx and /home/about
            {
                controllername = spliturl[1];
                actionname = spliturl[2];
                if (actionname.Contains("."))
                {
                    actionname = actionname.Substring(0, actionname.LastIndexOf("."));
                }
            }
            else //final block in final case sned it to Home Controller
            {
                controllername = defaultcontrollername;
            }
    
    
            RouteData rd = new RouteData(this, new MvcRouteHandler());
            rd.Values.Add("controller", controllername);
            rd.Values.Add("action", actionname);
            rd.Values.Add("url", url);
            return rd;
        }
    
        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        {
            return null;
        }
    }
    

    }

    in global.asax.cs add below code

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.Add(new MyUrlRoute()); // Add before your default Routes
    
            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );
    
        }
    

    working as expected.

    possibly you can improve if/elseif code.

提交回复
热议问题