Перенаправить маршрут по значениям маршрута - PullRequest
2 голосов
/ 15 сентября 2011

У меня есть маршрут по умолчанию в global.asax, определенный

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

Мне нужно добиться этого.

/somecontroller/edit/1 - когда id - это число, то отпустить его /somecontroller/edit/xxxx - когда id является строкой, перенаправьте его на /somecontroller/xxxx

и только когда действие называется edit.

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

В методе RegisterRoutes URL переводится в имя и значение контроллера, действия и других параметров.
Вы можете написать собственную логику маршрута карты - первая строка, которая будет удовлетворена, будет продолжена.

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}");            
2 голосов
/ 15 сентября 2011

Вероятно, вы не можете справиться только с маршрутами. Вам необходимо проверить его внутри действия Edit и перенаправить на действие Index в случае строкового значения, иначе обработайте действие редактирования.

ограничение маршрутизации

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.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
            new { id = new IsIntegerConstraint() }
        );
...