Почему я получаю «Словарь параметров содержит пустую запись для параметра» для моего пользовательского MapRoute - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть собственный маршрут, зарегистрированный в моем приложении, но только маршрут по умолчанию работает правильно.

Вот мои отображения маршрутов:

        routes.MapRoute(
            name: "MyCustomRoute",
            url: "Foo/Index/{myid}",
            defaults: new { controller = "Foo", action = "Index", myid = UrlParameter.Optional },
            namespaces: new[] { "MyApp.Controllers" }
        );

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

И мой метод действия FooController

 public ActionResult Index(int MyID)
    {
        //...
   return View();
    }

Если я добавлю параметр myid в строку запроса, все будет работать нормально (т.е.Foo / Индекс /? MyID = 1).Но переписанный URL (/ Foo / Index / 1) приводит к этой ошибке:

The parameters dictionary contains a null entry for parameter 'MyID' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Index(Int32)' in 'TPC_CS_Portal.Controllers.FooController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Parameter name: parameters

Как уже упоминалось, все мои другие контроллеры, которые используют маршрут по умолчанию (с параметром id), все работают нормально (например, / SomethingElse /Индекс / 1).

Что мне нужно сделать, чтобы мой собственный маршрут работал?

1 Ответ

1 голос
/ 26 апреля 2019

Проблема здесь заключалась в том, что был отдельный MapRoute, определенный в другом месте для FooController:

routes.MapRoute(
        name: "MyOtherCustomRoute",
        url: "Foo/Index/{param1}/{param2}",
        defaults: new { controller = "Foo", action = "Index", param1 = UrlParameter.Optional, param2 = UrlParameter.Optional },
        namespaces: new[] { "MyApp.Controllers" }
    );

Это было приоритетом (сопоставление с запрошенным URL), поэтому я переместил вещи так, чтобы они появлялись после MyCustomRoute.

...