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

ASP.NET MVC маршрутизации с одним обязательным параметром и одним необязательным параметром?

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

Я следую этому ответу здесь.

Вот мой пользовательский маршрут:

routes.MapRoute(
    "MyRoute",
    "{controller}/{action}/{param1}/{param2}",
    new { 
        controller = "MyController", 
        action = "MyAction", 
        param1 = "", 
        param2 = "" // I have also tried "UrlParameter.Optional" here.
    }
);

И моя подпись метода действия:

public ActionResult MyAction(string param1, string param2)

Если я попробую URL http://[myserver]/MyController/MyAction/Test1/Test2, то он будет работать так, как я ожидаю, с параметром param1 = "Test1" и param2 = "Test2"

Если я попробую URL http://[myserver]/MyController/MyAction/Test1, то оба параметра равны нулю.

Надеюсь, кто-то может сказать мне, что я здесь делаю неправильно, потому что я потерялся.

4b9b3361

Ответ 1

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

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

над вашим маршрутом, то он будет соответствовать запросу http://[myserver]/My/MyAction/Test1 и вызовет MyController.MyAction и установите "Text1" в параметр с именем id. Это не будет выполнено, потому что это действие не объявляет одно имя id.

Что вам нужно сделать, так это перенести свой маршрут как первый в списке маршрутов и сделать его более конкретным, чем сейчас:

routes.MapRoute(
            "Route",
            "My/{action}/{param1}/{param2}",
            new
            {
                controller = "My",
                action = "MyAction",
                param1 = "",
                param2 = ""
            });

Это приведет к тому, что весь трафик маршрутизированного желоба My будет соответствовать этому маршруту.

Ответ 2

Привет, вы создаете свой маршрут таким образом, я думаю, что это поможет вам

routes.MapRoute(
                "Regis", // Route nameRegister
                "Artical/{id}", // URL with parameters
                new { controller = "Artical", action = "Show", id = UrlParameter.Optional } // Parameter defaults
            );

Ответ 3

Попробуйте это

routes.MapRoute("MyRoute",
                 "myRoute/{param1 }/{param2 }",
                 new { controller = "MyController", action = "MyAction", param2 = UrlParameter.Optional },
                 new { param2 = @"\w+" });

вы можете указать один параметр как необязательный, используя " UrlParameter.Optional" и указанный второй с помощью DataType означает, что если вы передаете целочисленное значение, то DataType (@ "\ d +" ), а для строки я упоминание выше.

ПРИМЕЧАНИЕ: Последовательность параметра очень важна Необязательный параметр должен пройти наконец и зарегистрировать новый маршрут до маршрута по умолчанию В Gloab.asax.

тогда ссылка на действие, например

<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1",param1 = "Test2"})">Test</a>

ИЛИ с одним параметром

  <a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1"})">Test</a>

В контроллере

 public ActionResult MyAction(string param2,string param1)
 {
   return View()
 }