user256034
user256034

Reputation: 4369

Redirect route by route values

I have the default route in global.asax defined

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

I need to achieve this.

/somecontroller/edit/1 - when the id is a number then let it go /somecontroller/edit/xxxx - when the id is a string then redirect it to /somecontroller/xxxx

and only when the action is called edit.

Upvotes: 2

Views: 2686

Answers (2)

Filias
Filias

Reputation: 71

In RegisterRoutes method is url translated to name and value of controller, action and other parameters.
You can write your own map route logic - first line which is satisfied will be proceeded.

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

// empty url is mapping to Home/Index
routes.MapRoute(null, "", new { controller = "Home", action = "Index", id = UrlParameter.Optional });

// accepts "Whatever/Edit/number", where Whatever is controller name (ie Home/Edit/123)
routes.MapRoute(null,
      // first is controller name, then text "edit" and then parameter named id
      "{controller}/edit/{id}", 
      // we have to set action manually - it isn't set in url - {action} not set
      new { action = "edit"},  
      new { id = @"\d+" }      // id can be only from digits
    );


// action name is AFTER edit (ie Home/Edit/MyActionMethod)
routes.MapRoute(null, "{controller}/edit/{action}");

// default action is index -> /Home will map to Home/Index
routes.MapRoute(null, "{controller}", new{action="Index"}); 

// accepts controller/action (Home/Index or Home/Edit)
routes.MapRoute(null, "{controller}/{action}");                 

// controller_name/action_name/whatever, where whatever is action method's id parameter (could be string)
routes.MapRoute(null, "{controller}/{action}/{id}");            

Upvotes: 2

Samich
Samich

Reputation: 30185

Probably you can't handle it only by routes. You need to check it inside Edit action and redirect to the Index action in case of string value, otherwise handle edit action.

routing constraint

public class IsIntegerConstraint : IRouteConstraint
{
    #region IRouteConstraint Members

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        int result;

        return int.TryParse(values[parameterName].ToString(), out result);
    }

    #endregion
}

routes

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
            new { id = new IsIntegerConstraint() }
        );

Upvotes: 2

Related Questions