2

Masters,

In my project I have specified many different routes something like follows.

routes.MapRoute(
   name: "StudentMerit", 
   url: "Student-Merit", 
   defaults: new { controller = "StudentMerit", action = "GetData"});

routes.MapRoute(
   name: "StudentResults", 
   url: "Student-Results", 
   defaults: new { controller = "StudentResults", action = "GetData"});

As you can see url is hyphen separated and i am not much worried about action name

All this routes can be rewritten if i can tell MVC that Replace Hyphen with nothing in URL and it will be my controller.

Something like,

routes.MapRoute(
   name: "AllInOne", 
   url: "{Cont-roller}", 
   defaults: new { controller = {Cont-roller}.replace("-",""), action = "GetData"});

Is there any way to do this? Please help.

Thanks in advance.

1 Answer 1

4

Create your own RouteHandler. I don't know if this is the best solution though.

public class RemoveDashRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        requestContext.RouteData.Values["controller"] = ((string)requestContext.RouteData.Values["controller"]).Replace("-", String.Empty);

        return base.GetHttpHandler(requestContext);
    }
}

Usage

routes.MapRoute(
     name: "AllInOne",
     url: "{controller}",
     defaults: new { controller = "Default", action = "GetData" }
).RouteHandler = new RemoveDashRouteHandler();

Edit for alternative solution

I found a better solution (in my opinion) by sub-classing Route then overriding GetRouteData. It's better since Route's responsibility is to generate the RouteData while MvcRouteHandler's responsibility is to get the IHttpHandler.

public class RemoveDashRoute : Route
{
    private const string ControllerKey = "controller";

    public RemoveDashRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints = null, RouteValueDictionary dataTokens = null, IRouteHandler routeHandler = null)
        : base(url, defaults, constraints ?? new RouteValueDictionary(), dataTokens ?? new RouteValueDictionary(), routeHandler ?? new MvcRouteHandler())
    {
    }
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var routeData = base.GetRouteData(httpContext);
        if (routeData != null && routeData.Values.ContainsKey(ControllerKey))
        {
            routeData.Values[ControllerKey] = ((string)routeData.Values[ControllerKey]).Replace("-", String.Empty);
        }
        return routeData;
    }
}

Usage

routes.Add("AllInOne", new RemoveDashRoute(
    url: "{controller}",
    defaults: new RouteValueDictionary(new { controller = "Home", action = "GetData" }))
);
Sign up to request clarification or add additional context in comments.

2 Comments

You probably meant RemoveDashRouteHandler.
Yes.. Second option seems better!!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.