разрешить дефисы в URL для имен контроллеров asp.net mvc 2 - PullRequest
6 голосов
/ 12 марта 2011
[ActionName("about-us")]
public ActionResult EditDetails(int id)
{
    // your code
}

Вышеуказанное работает для действий, но я хотел бы иметь возможность сделать то же самое (или подобное) для контроллеров, то есть иметь дефис в имени URL. Есть ли простой способ добиться этого (я пробовал атрибут ActionName, но не повезло)

Ответы [ 5 ]

7 голосов
/ 12 марта 2011

Самый простой способ - добавить собственный маршрут:

routes.MapRoute("RouteName", "controler-name/{action}/{id}", new { controller = "ControllerName", action = "Index", id = "" });

Я не видел подобного атрибута имени контроллера, хотя это возможно.

3 голосов
/ 16 июня 2011

Вы можете использовать пользовательский обработчик маршрута, чтобы предоставить вам необходимую функциональность:

public class HyphenatedRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
        requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");

        return base.GetHttpHandler(requestContext);
    }
}

И маршрут должен быть зарегистрирован с использованием этого обработчика:

var route = routes.MapRoute(
    "Some Action",
    "{controller}/{action}/{id}"
);

route.RouteHandler = new HyphenatedRouteHandler();

Здесь задается аналогичный вопрос: Поддержка ASP.net MVC для URL с дефисами

0 голосов
/ 18 ноября 2012

Может быть, здесь правильный ответ на вопрос.Все остальные обходные пути, которые работают для одного URL, но это общий подход

http://blog.didsburydesign.com/2010/02/how-to-allow-hyphens-in-urls-using-asp-net-mvc-2/

0 голосов
/ 03 февраля 2012

Маршрут с дефисом в таблице маршрутов должен предшествовать маршруту по умолчанию.

routes.MapRoute(
                  "InformationAbout", 
                  "information-about/{action}/{id}", 
                   new { controller = "InformationAbout", action = "Index", id = "" }
                );

 routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }
0 голосов
/ 14 марта 2011

Может быть, это работает:

public class CustomControllerFactory : DefaultControllerFactory {

   protected override Type GetControllerType(RequestContext requestContext, string controllerName) {
      return base.GetControllerType(requestContext, controllerName.Replace("-", ""));
   }
}
...