Проблема маршрутизации MVC3 с несколькими параметрами - PullRequest
3 голосов
/ 31 июля 2011

Я определяю свою ссылку действия следующим образом:

 @Html.ActionLink("Visit profile By Name", "UserProfile", "User", new { UserId = 2, UserName = "Sandeep" }, null)

, которая генерирует ссылку:

http://localhost:2010/User/UserProfile/Sandeep/2

Если username == string.empty (поскольку имя пользователя приходит динамически), тогда ссылка становится

http://localhost:2010/User/UserProfile?UserId=2

Но в этом случае я хочу, чтобы моя ссылка выглядела следующим образом:

http://localhost:2010/User/UserProfile/2

Значение таблицы маршрутов:

       routes.MapRoute(
           "UserName", // Route name
           "User/UserProfile/{UserName}/{UserId}", // URL with parameters
           new { controller = "User", action = "UserProfile", UserName = UrlParameter.Optional, UserId = UrlParameter.Optional } // Parameter defaults
       );

Ответы [ 3 ]

3 голосов
/ 31 июля 2011

сменить маршрут

routes.MapRoute( "UserName", // Route name 
              "User/UserProfile/{UserName}/{UserId}", // URL with parameters 
               new { 
                   controller = "User", 
                    action = "UserProfile", 
                    UserName = "UserProfile",  /*change this */
                     UserId = UrlParameter.Optional 
                  }  // Parameter defaults 
                 );

изменить UserName = UrlParameter.Optional на UserName = "UserProfile"

0 голосов
/ 31 июля 2011

Это упрощение ответа Мистера Мана.

routes.MapRoute("UserName",
                "User/UserProfile/{UserName}/{UserId}",
                new { controller = "User", action = "UserProfile" }
);

routes.MapRoute("UserIdOnly",
                "User/UserProfile/{UserId}",
                new { controller = "User", action = "UserProfile" }
);

Все, что вам нужно сделать, это удалить UrlParameter.Optional в вашем маршруте и указать второй маршрут. Причина, по которой URL выглядит http://localhost:2010/User/UserProfile?UserId=2, заключается в том, что он не совпадает с вашим маршрутом UserName, но вместо этого используется маршрут по умолчанию:

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

Я изменил порядок маршрутов Mystere Man и изменил параметр UserNameId на UserId. Если имя пользователя пустое или пустое, оно не будет совпадать с маршрутом имени пользователя, но будет соответствовать второму (UserIdOnly) маршруту и ​​даст вам искомый URL.

0 голосов
/ 31 июля 2011

Я думаю, что вам нужно сделать два маршрута.

routes.MapRoute("UserName",                             // Route name
                "User/UserProfile/{UserNameId}", // URL with parameters
                new { controller = "User", 
                      action = "UserProfile"
);

routes.MapRoute("UserName",                             // Route name
                "User/UserProfile/{UserName}/{UserId}", // URL with parameters
                new { controller = "User", action = "UserProfile"
);

Затем в вашем методе UserProfile(string userNameId) вы бы проверили, является ли userNameId числовым, и если да, то установите UserId,если нет, тогда задайте UserName.

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

Возможно, вы захотите добавить значения по умолчанию, если у вас есть режим, в котором перечислены профили, если нет имени пользователяили идентификатор отправлен.

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