ASP.NET MVC - передача параметров в контроллер - PullRequest
100 голосов
/ 01 октября 2008

У меня есть контроллер с методом действия следующим образом:

public class InventoryController : Controller
{
    public ActionResult ViewStockNext(int firstItem)
    {
        // Do some stuff
    }
}

И когда я запускаю его, я получаю сообщение об ошибке:

Словарь параметров не содержит допустимого значения типа 'System.Int32' для параметра 'firstItem'. Чтобы сделать параметр необязательным, его тип должен быть либо ссылочным типом, либо типом Nullable.

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

Я использую этот синтаксис URL для вызова действия:

http://localhost:2316/Inventory/ViewStockNext/11

Есть идеи, почему я получу эту ошибку и что мне нужно сделать, чтобы ее исправить?

Я попытался добавить другой метод, который принимает целое число к классу, если он тоже не работает по той же причине. Я попытался добавить тот, который принимает строку, и строка имеет значение null. Я попытался добавить один без параметров, и он отлично работает, но, конечно, он не будет соответствовать моим потребностям.

Ответы [ 10 ]

101 голосов
/ 01 октября 2008

Ваш маршрут должен быть настроен в соответствии с {controller}/{action}/{firstItem}. Если вы оставили маршрутизацию по умолчанию {controller}/{action}/{id} в файле global.asax.cs, то вам нужно будет передать id.

routes.MapRoute(
    "Inventory",
    "Inventory/{action}/{firstItem}",
    new { controller = "Inventory", action = "ListAll", firstItem = "" }
);

... или что-то подобное.

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

вы можете изменить firstItem на id, и он будет работать

вы можете изменить маршрутизацию на global.asax (я не рекомендую это)

и, не могу поверить, никто не упомянул об этом, вы можете позвонить:

http://localhost:2316/Inventory/ViewStockNext?firstItem=11

В @ Url.Action будет:

@Url.Action("ViewStockNext", "Inventory", new {firstItem=11});

в зависимости от типа того, что вы делаете, последний будет более подходящим. Также вы должны рассмотреть не выполнение действия ViewStockNext, а вместо этого действие ViewStock с индексом. (мои 2цента)

15 голосов
/ 01 октября 2008

Чтобы перефразировать ответ Джаррета Майера , вам нужно изменить имя параметра на 'id' или добавить маршрут, подобный этому:

routes.MapRoute(
        "ViewStockNext", // Route name
        "Inventory/ViewStockNext/{firstItem}",  // URL with parameters
        new { controller = "Inventory", action = "ViewStockNext" }  // Parameter defaults
    );

Причина в том, что маршрут по умолчанию ищет только действия без параметра или параметра с именем 'id'.

Редактировать: Хех, неважно, Джаррет добавил пример маршрута после публикации.

7 голосов
/ 12 сентября 2012

Headspring создал хорошую библиотеку, которая позволяет вам добавлять псевдонимы к вашим параметрам в атрибутах действия. Это выглядит так:

[ParameterAlias("firstItem", "id", Order = 3)]
public ActionResult ViewStockNext(int firstItem)
{
    // Do some stuff
}

При этом вам не нужно изменять маршрутизацию только для обработки другого имени параметра. Библиотека также поддерживает его применение несколько раз, так что вы можете отобразить несколько вариантов написания параметров (удобно при рефакторинге без нарушения вашего открытого интерфейса).

Вы можете получить его у Nuget и прочитать статью Джеффри Палермо об этом здесь

7 голосов
/ 25 января 2009

public ActionResult ViewNextItem(int? id) делает целое число id обнуляемым типом, нет необходимости в преобразованиях строки <-> int.

4 голосов
/ 28 августа 2015

или сделать это с помощью атрибута маршрута:

public class InventoryController : Controller
{
    [Route("whatever/{firstItem}")]
    public ActionResult ViewStockNext(int firstItem)
    {
        int yourNewVariable = firstItem;
        // ...
    }
}
2 голосов
/ 04 апреля 2017

Использование функции ASP.NET Core Tag Helper:

<a asp-controller="Home" asp-action="SetLanguage" asp-route-yourparam1="@item.Value">@item.Text</a>
1 голос
/ 11 октября 2009

Есть еще один способ сделать это (более подробно описанный в примере Стивена Вальтера Пейджер

По сути, вы создаете ссылку в представлении:

Html.ActionLink("Next page", "Index", routeData)

В routeData вы можете указать пары имя / значение (например, routeData ["page"] = 5), а в индексной функции контроллера соответствующие параметры получат значение. То есть

public ViewResult Index(int? page)

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

0 голосов
/ 19 января 2012

Причиной особой обработки «id» является то, что он добавляется в отображение маршрута по умолчанию. Чтобы изменить это, перейдите на Global.asax.cs, и вы найдете следующую строку:

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

Измените его на:

routes.MapRoute ("Default", "{controller}/{action}", 
                 new { controller = "Home", action = "Index" });
0 голосов
/ 10 декабря 2008

Или вы можете попробовать изменить тип параметра на строку, а затем преобразовать строку в целое число в методе. Я новичок в MVC, но я полагаю, что вам нужны обнуляемые объекты в списке параметров, как еще контроллер будет указывать, что такой параметр не был предоставлен? Итак ...

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