asp.net-coreroutesasp.net-core-2.0route-providernopcommerce-4.0

Remove route from RouteCollection in Asp.Net Core and add new with same route name (nopCommerce-4.00)


I want to remove existing route from RouteCollection and want to add new route with same route name in nopCommerce 4.00 via plugin

Existing route name:

//home page
            routeBuilder.MapLocalizedRoute("HomePage", "",
        new { controller = "Home", action = "Index" });

I Want to replace it with

   routeBuilder.MapLocalizedRoute("HomePage", "",
    new { controller = "CustomPage", action = "Homepage" });

I tried several ways but not get any luck.


Solution

  • In my case, I have to replace the robots.txt generation. I created a new public controller in my plugin, and I copy the original action here:

    public class MiscCommonController : BasePublicController
    {
        #region Fields
        private readonly ICommonModelFactory _commonModelFactory;
        #endregion Fields
    
        #region Ctor
        public MiscCommonController(
            ICommonModelFactory commonModelFactory
            )
        {
            this._commonModelFactory = commonModelFactory;
        }
        #endregion Ctor
    
        #region Methods
        //robots.txt file
        //available even when a store is closed
        [CheckAccessClosedStore(true)]
        //available even when navigation is not allowed
        [CheckAccessPublicStore(true)]
        public virtual IActionResult RobotsTextFile()
        {
            var robotsFileContent = _commonModelFactory.PrepareRobotsTextFile();
            return Content(robotsFileContent, MimeTypes.TextPlain);
        }
        #endregion Methods
    }
    

    After this I create a RouteProvider for my plugin, and I replaced the original route to my own one.

    public partial class RouteProvider : IRouteProvider
    {
        /// <summary>
        /// Gets a priority of route provider
        /// </summary>
        public int Priority => -1;
    
        /// <summary>
        /// Register routes
        /// </summary>
        /// <param name="routeBuilder">Route builder</param>
        public void RegisterRoutes(IRouteBuilder routeBuilder)
        {
            Route route = null;
    
            foreach (Route item in routeBuilder.Routes)
            {
                if (item.Name == "robots.txt")
                {
                    route = item;
                    break;
                }
            }
    
            if (route != null) routeBuilder.Routes.Remove(route);
    
            routeBuilder.MapRoute(
                "robots.txt",
                "robots.txt",
                new { controller = "MiscCommon", action = "RobotsTextFile" }
            );
        }
    }
    

    That's all.

    After this implementation, the routing works fine, and the get request landed in my own controller, which is act like the original.

    Now, I can replace the generation logic with my own.

    I hope it helps.