Словарь параметров mvc содержит нулевую запись ..... ошибка / проблема маршрутизации - PullRequest
0 голосов
/ 12 июля 2011

Итак, у меня есть этот контроллер под названием Cars, и он имеет:

namespace MySite.Controllers
{
    public class CarsController : ApplicationController
    {

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult New()
        {
            return View();
        }
        [httppost]
        public ActionResult New()
        {
            return View();
        }


        public ActionResult Details(int id)
        {
            return View();
        }
    }
}

Global Asax

       routes.MapRouteLowerCase(
            "Cars", // Route name
            "Cars/{id}", // URL with parameters
            new { controller = "Cars", action = "Details", id = URLParameter.Optional}
        );

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

Вот ошибка, которую я получаю:

словарь параметров содержит пустую запись для параметра non Обнуляемый тип для метода в

ПРИМЕЧАНИЕ: он перенаправляет меня на "Детали" представления и запрашивает int, даже если я хотел перейти на "Новый" вид. Я не совсем уверен, что происходит? Я в основном хотел, чтобы мои URL-адреса были в нижнем регистре при удалении «действия» по URL-адресу в маршрутизации промоутера ... Это имеет смысл? Любая помощь приветствуется! Спасибо !!!

Ответы [ 2 ]

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

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

Ваш маршрут неверен

Взгляните на первое определение маршрута:

routes.MapRouteLowerCase(
    "Cars", // Route name
    "Cars/{id}", // URL with parameters
    new { controller = "Cars", action = "Details", id = URLParameter.Optional}
);

И когда вы получаете доступ к Cars/New, этот первый маршрут получает доступ, потому что все параметры легко применяются как:

  • контроллер = "Cars"
  • действие = "Details"
  • id = "New"

Если вы хотите, чтобы первое определение маршрута охватывало только определенные идентификаторы, вы должны наложить на него ограничение или изменить маршрут. Ограничение для числовых идентификаторов должно выглядеть следующим образом:

routes.MapRouteLowerCase(
    "Cars", // Route name
    "Cars/{id}", // URL with parameters
    new { controller = "Cars", action = "Details" },
    new { id = @"\d+" }
);

Когда вы получите доступ к Cars/New, первый маршрут не будет достигнут, потому что New не удовлетворяет ограничениям ID, поэтому обработка маршрута будет продолжена со следующего маршрута (что разрешит его просто отлично - как и должно).

Помните, что id больше не является обязательным. В случае наложения ограничений на это не может быть. Если у вас есть действие контроллера Details, оно, скорее всего, должно отображать некоторые подробности. Так что на самом деле нужен какой-то идентификатор.

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

Если ваш маршрут настроен так:

routes.MapRouteLowerCase(
    "Cars", // Route name
    "Cars/{id}", // URL with parameters
    new { controller = "Cars", action = "Details", id = URLParameter.Optional}
);

, это означает, что любой URL, начинающийся с "/ Cars / ...", перенаправит вас на действие Details, которое включает в себя "/ Cars / New"и он попытается сопоставить «новую» строку с параметром id, поэтому вы получаете сообщение об ошибке.

...