Asp. Net MVC Концепция маршрутизации - PullRequest
0 голосов
/ 06 августа 2020

У меня проблема с маршрутизацией в MVC.

Я определил следующие маршруты в Route.Config

  routes.MapRoute(
            name: "Test",
            url: "{controller}/{action}/{param}",
            defaults: new { controller = "Home", action = "FirstAction" }
        );
        routes.MapRoute(
            name: "Testy",
            url: "{controller}/{action}/{secondparm}",
            defaults: new { controller = "Home", action = "SecondAction" }
        );

        routes.MapRoute(
          name: "Test2",
          url: "{controller}/{action}/{encodedparam}",
          defaults: new { controller = "User", action = "UserInfo" }
      );

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

Проблема в том, что первый маршрут работает хорошо, но во втором и третьем я получил нулевые значения для соответствующего параметра.

Я что-то пропустил?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Поскольку вы хотите использовать URL-адрес таким образом: localhost:portnumber/home/secondaction/value вместо localhost:portnumber/home/secondaction?secondparam=value.

Вы должны следовать приведенному ниже подходу, который будет вести себя как generi c для всех ваших методов действий , независимо от того, содержат ли они параметры или нет.

  • Объявить маршрут по умолчанию в RouterConfig.cs как:
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
  • Тогда имя параметра в методе должно быть таким же как в маршруте по умолчанию:
public ActionResult SecondAction(string id)
{ 
    return View(); 
}
  • Тип параметра может быть любым.

Таким образом, вам не нужно объявлять другие маршруты.

0 голосов
/ 06 августа 2020

Вы должны соответствовать имени параметра для третьего. Если вы напишите:

{id}

, вы должны написать

publi c ActionResult AnyAction (int id )

id может быть любого типа

Я думаю, что между вашими маршрутами существует конфликт. Вам нужно только это сопоставление:

routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }  // Parameter defaults
        );

, если вам нужна настраиваемая маршрутизация для других элементов, не помещайте "{controller}/{action}/..." внутрь, потому что он возьмет первую конфигурацию маршрута, которая соответствует. Вы можете вызвать все свои маршруты, уточняя имя вашего параметра, если оно отличается от id:

http://localhost/home/firstaction?param=123
http://localhost/home/secondaction?secondparam=123
http://localhost/user/userinfo?encodedparam=123
...