Подтвердить что ты не робот

ASP.NET MVC - удаление имени контроллера из URL-адреса

Я хочу удалить имя контроллера из моего URL (для одного конкретного контроллера). Например:

http://mydomain.com/MyController/MyAction

Я бы хотел, чтобы этот URL-адрес был изменен на:

http://mydomain.com/MyAction

Как мне это сделать в MVC? Я использую MVC2, если это помогает мне в любом случае.

4b9b3361

Ответ 1

Вы должны сопоставить новый маршрут в global.asax(добавьте его до значения по умолчанию), например:

routes.MapRoute("SpecificRoute", "{action}/{id}", new {controller = "MyController", action = "Index", id = UrlParameter.Optional});

// default route
routes.MapRoute("Default", "{controller}/{action}/{id}", new {controller = "Home", action = "Index", id = UrlParameter.Optional} );

Ответ 2

Чтобы обновить это для 2016 года, лучший способ сделать это - использовать маршрутизацию атрибутов.

Проблема с этим в RouteConfig.cs заключается в том, что старый маршрут также будет работать - так что вы будете иметь

http://example.com/MyController/MyAction

и

http://example.com/MyAction

Наличие нескольких маршрутов на одной странице плохо для SEO - может вызвать проблемы с контентом, а также создавать страницы и ошибки зомби в вашем приложении.

С помощью маршрутизации атрибутов вы избегаете этих проблем. Все, что вам нужно сделать, это добавить это в RouteConfig.cs(вероятно, наверху, прежде чем другие маршруты могут совпасть):

routes.MapMvcAttributeRoutes();

Затем добавьте атрибут маршрута к каждому действию с именем маршрута, например

[Route("MyAction")]
public ActionResult MyAction()
{
...
}

Ответ 3

Вот шаги для удаления имени контроллера из HomeController

Шаг 1: Создайте ограничение маршрута.

public class RootRouteConstraint<T> : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var rootMethodNames = typeof(T).GetMethods().Select(x => x.Name.ToLower());
        return rootMethodNames.Contains(values["action"].ToString().ToLower());
    }
}

Шаг 2:
Добавьте новое сопоставление маршрутов над вашим сопоставлением по умолчанию, которое использует ограничение маршрута, которое мы только что создали. Общий параметр должен быть классом контроллера, который вы планируете использовать в качестве вашего контроллера "Root".

routes.MapRoute(
    "Root",
    "{action}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new { isMethodInHomeController = new RootRouteConstraint<HomeController>() }
);

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Теперь вы должны иметь доступ к своим методам домашнего контроллера, например: example.com/about, example.com/contact

Это повлияет только на HomeController. Все остальные контроллеры будут иметь функциональные возможности маршрутизации по умолчанию.

Ответ 4

Вам нужно будет изменить маршруты по умолчанию для MVC. В блоге ScottGu есть подробное объяснение: http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

Метод, который вы должны изменить, - Application_Start. Что-то вроде следующего может помочь:

RouteTable.Routes.Add(new Route(
  Url="MyAction"
  Defaults = { Controller = "MyController", action = "MyAction" },
  RouteHandler = typeof(MvcRouteHandler)
}

Порядок маршрутов значителен. Он остановится в первом матче. Таким образом, значение по умолчанию должно быть последним.

Ответ 5

routes.MapRoute("SpecificRoute", "MyController/{action}/{id}", 
         new {controller = "MyController", action = "Index", 
         id = UrlParameter.Optional});

// default route
routes.MapRoute("Default", "{controller}/{action}/{id}", 
         new {controller = "Home", action = "Index", 
         id = UrlParameter.Optional} );