Маршрут контроллера ASP.NET MVC 3 - сделать так, чтобы все под домашним контроллером отображалось под доменом - PullRequest
17 голосов
/ 08 сентября 2011

В настоящее время все, что находится под homecontroller, отображается в URL как

example.com/Home/{Action}

Есть ли способ, которым мы можем сохранить все остальные маршрутизации такими, какие они есть, кроме ТОЛЬКО особого домашнего контроллера, чтобы все находящееся под домом входило в домен.

как

example.com/about
example.com/contact
example.com/error

вместо создания новых классов контроллеров для каждого из них.

EDIT:

Другой URL похож на

example.com/user/details/123
example.com/user/edit/123

которые в userController должны работать так же, как они сейчас

Ответы [ 4 ]

14 голосов
/ 08 сентября 2011

Я думаю, что лучший способ это:

 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 */})

OR

@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

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

6 голосов
/ 05 января 2014

Используя Attribute Routing of MVC5, я сделал аналогично ответу Javad_Amiry, разместив маршрут для каждого действия в HomeController:

public class HomeController : Controller
{
    [Route("about")]
    public ActionResult About()
    {
        return View();
    }

Я думаю, что это более приемлемо, чем размещение каждого действия в глобальном RouteConfigФайл .cs.Еще лучше объединить маршрутизацию атрибутов с маршрутизацией на основе соглашений, поэтому новые действия, добавленные в контроллер, будут работать по умолчанию без атрибута Route (например, / Home / action), но могут быть улучшены путем добавления атрибута Route (например: / action).

0 голосов
/ 12 октября 2013
0 голосов
/ 08 сентября 2011

Вы можете просто изменить маршрут по умолчанию и удалить бит контроллера из URL и указать, что он всегда будет Home в значениях по умолчанию:

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

Очевидно, вы понимаете, что это ограничивает ваше приложениек одному контроллеру, который равен HomeController, так как теперь у вас больше нет возможности установить его в своем URL.Заполнение всех действий в одном контроллере является ИМХО плохой практикой и нарушает несколько принципов, таких как маршрутизация RESTful и SRP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...