ASP.NET MVC - удаление имени контроллера из URL-адреса
Я хочу удалить имя контроллера из моего URL (для одного конкретного контроллера). Например:
http://mydomain.com/MyController/MyAction
Я бы хотел, чтобы этот URL-адрес был изменен на:
http://mydomain.com/MyAction
Как мне это сделать в MVC? Я использую MVC2, если это помогает мне в любом случае.
Ответы
Ответ 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} );