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

Маршрутизатор 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, должны работать так же, как и сейчас.

4b9b3361

Ответ 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.