Использование Html.ActionLink с RouteValues - PullRequest
10 голосов
/ 03 декабря 2011

У меня есть следующий HTML:

<%: Html.ActionLink(item.ProductName, "Details", "Product", new { item.ProductId }, null)%>

Это отображается как:

<a href="/Product/Details?ProductId=1">My Product Name</a>

Однако, когда я нажимаю на это, я получаю следующую ошибку:

Словарь параметров содержит пустую запись для параметра 'id' необнуляемого типа 'System.Int32' для метода 'System.Web.Mvc.ActionResult Details (Int32)' в 'MyProject.Controllers.ProductController».Необязательный параметр должен быть ссылочным типом, обнуляемым типом или быть объявлен как необязательный параметр.

Имя параметра: параметры

Похоже, что моя маршрутизация не любит строку запроса "? ProductId = 1".

Если я использую вместо:

<%: Html.ActionLink(item.ProductName, string.Format("Details/{0}", item.ProductId), "Product", null, null)%>

Я получаю следующую ссылку:

<a href="/Product/Details/1">My Product Name</a>

... и это работает правильно при нажатии.

Я что-то здесь упускаю?Я хотел бы использовать RouteValues, но я не понимаю, почему возникает эта ошибка.Как я могу заставить свой метод Controller принимать параметры строки запроса?

Единственное отображение маршрута, которое у меня есть:

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

Ответы [ 2 ]

10 голосов
/ 03 декабря 2011

Измените параметр действия на int ProductId.

public ActionResult Details(int productId)
{
    return View("");
}

ваш контроллер должен получить параметр "id", потому что вы объявили его как , а не nullable int, поэтому при отправке productId он все еще не соответствует сигнатуре функции.
если вы не укажете имя параметра, по умолчанию для маршрутизации в global.asax имя параметра будет изменено на id:

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

см. Последнюю строку.

1 голос
/ 03 декабря 2011

Вы устанавливаете символ / в качестве разделителей между контроллером, действием и идентификатором (параметрами), если вы вызываете URL-адрес, например /Product/Details?ProductId=1, вы вызываете контроллер Product, но действие с текстом Details?ProductId=1 и тогда маршрутизация не получает следующий /.

...