Маршрутизатор ASP.NET MVC 3 - запустите все под домашним контроллером под доменом
В настоящее время все под управлением homcontontrol появляется в URL как
example.com/Home/{Action}
Есть ли способ, которым мы можем сохранить любую другую маршрутизацию так, как она есть, а ТОЛЬКО специальный домашний контроллер дома, поэтому все под домашней подпиской находится под доменом.
like
example.com/about
example.com/contact
example.com/error
вместо создания новых классов контроллеров для каждого из них.
EDIT:
Другой URL-адрес, например
example.com/user/details/123
example.com/user/edit/123
которые находятся в userController, должны работать так же, как и сейчас.
Ответы
Ответ 1
Я думаю, что лучший способ:
routes.MapRoute("home", "home", new { controller = "Home", action = "Index" });
routes.MapRoute("about", "about", new { controller = "Home", action = "About" });
routes.MapRoute("contact", "contact", new { controller = "Home", action = "Contact" });
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
и если вы хотите создать ссылку, используйте:
@Html.RouteLink("Home", "home", new{/* route values */}, new {/* html attribues */})
ИЛИ
@Html.RouteLink("Home", "home")
вместо:
@Html.ActionLink("Home", "Index", "Home", new{/* route values */}, new {/* html attribues */})
это работает для меня, и я должен работать и на вас.
UPDATE:
вы можете создать символ типа @
(или -
или что-нибудь еще) перед частью action
в URL-адресе, чтобы сделать URL уникальным, например:
routes.MapRoute(
"test", // route name
"@{action}", // url and parameters
new {controller = "MyHome", action = "Home"} // parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
таким образом, ваши URL-адреса отличаются от маршрута карты по умолчанию, и вы можете создавать URL-адреса, например:
site.com/@Home
site.com/@About
site.com/@Contact
но первое, по моей идее, лучше, и я всегда использую это.
Ответ 2
Используя Маршрутизацию атрибутов MVC5, я сделал аналогичный ответ Javad_Amiry, разместив маршрут для каждого действия в HomeController:
public class HomeController : Controller
{
[Route("about")]
public ActionResult About()
{
return View();
}
Я думаю, что это более удобно, чем размещать все действия в глобальном файле RouteConfig.cs. Лучше всего объединить Маршрутизацию атрибутов с маршрутизацией на основе конвенций, поэтому новые действия, добавленные в контроллер, будут работать по умолчанию без атрибута Route (например:/Home/action), но могут быть улучшены добавлением атрибута Route (например:/action).
Ответ 3
Вы можете просто изменить маршрут по умолчанию и удалить бит контроллера из URL-адреса и указать, что он всегда будет Home
в значениях по умолчанию:
routes.MapRoute(
"Default",
"{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Очевидно, вы понимаете, что это ограничивает ваше приложение единственным контроллером, который HomeController
, поскольку теперь у вас больше нет возможности установить его в своем URL-адресе. Наполнение всех действий в одном контроллере является плохой практикой IMHO и нарушает пару принципов, таких как RESTful routing и SRP.
Ответ 4
Коренные URL-адреса ASP.NET MVC с общей маршрутизацией