У меня есть контроллер с методом действия следующим образом:
public class InventoryController : Controller
{
public ActionResult ViewStockNext(int firstItem)
{
// Do some stuff
}
}
И когда я запускаю его, я получаю сообщение об ошибке:
Словарь параметров не содержит допустимого значения типа System.Int32 для параметра firstItem. Чтобы сделать параметр необязательным, его тип должен быть либо ссылочным, либо Nullable.
Однажды у меня это работало, и я решил попробовать функцию без параметров. Обнаружив, что контроллер не был постоянным, я вернул параметр, теперь он отказывается распознавать параметр, когда я вызываю метод.
Я использую этот синтаксис URL для вызова действия:
http://localhost:2316/Inventory/ViewStockNext/11
Есть идеи, почему я получаю эту ошибку и что мне нужно сделать, чтобы ее исправить?
Я попытался добавить еще один метод, который принимает целое число в класс, но он также не работает по той же причине. Я пробовал добавить тот, который принимает строку, и для строки установлено значение null. Я пробовал добавить один без параметров, и он отлично работает, но, конечно, мне не подходит.
источник
new { firstItem = @"\d" }
. Таким образом, он будет принимать, только если параметр является любым числом. Вы можете изменить регулярное выражение по своему усмотрению и даже ограничить количество десятичных знаков, например:new { firstItem = @"\d{4}" }
- теперь оно может состоять только из 4 чисел. Изменить: пример полностью измененного MapRoute: jsfiddle.net/HJRgTвы можете изменить firstItem на id, и он будет работать
вы можете изменить маршрутизацию на global.asax (я не рекомендую это)
и, не могу поверить, что никто об этом не упомянул, вы можете позвонить:
В @ Url.Action будет:
в зависимости от того, чем вы занимаетесь, последний будет более подходящим. Также вам следует подумать о том, чтобы не выполнять действие ViewStockNext, а вместо этого выполнять действие ViewStock с index. (мои 2 цента)
источник
Чтобы перефразировать ответ Джаррета Мейера , вам нужно изменить имя параметра на id или добавить такой маршрут:
Причина в том, что маршрут по умолчанию ищет только действия без параметра или параметр с именем 'id'.
Изменить: Хех, неважно, что Джаррет добавил пример маршрута после публикации.
источник
или сделайте это с помощью атрибута маршрута:
источник
routes.MapMvcAttributeRoutes();
вRegisterRoutes(RouteCollection)
методе приложения (обычно в шаблоне App_Start \ RouteConfig.cs). По умолчанию его может не быть.Headspring создал прекрасную библиотеку, которая позволяет добавлять псевдонимы к вашим параметрам в атрибутах действия. Это выглядит так:
При этом вам не нужно изменять маршрутизацию только для обработки другого имени параметра. Библиотека также поддерживает его многократное применение, поэтому вы можете сопоставить несколько вариантов написания параметров (удобно при рефакторинге без нарушения общедоступного интерфейса).
Вы можете получить его у Nuget и прочитать статью Джеффри Палермо об этом здесь.
источник
public ActionResult ViewNextItem(int? id)
делаетid
целое число типом, допускающим значение NULL, нет необходимости в преобразованиях string <-> int.источник
Использование вспомогательной функции тегов ASP.NET Core:
источник
Есть еще один способ добиться этого (более подробно описанный в примере Стивена Вальтера с пейджером.
По сути, вы создаете ссылку в представлении:
В routeData вы можете указать пары имя / значение (например, routeData ["page"] = 5), а в функции Index контроллера соответствующие параметры получают значение. То есть,
страница будет передана как 5. Я должен признать, что довольно необычно, что строка ("страница") автоматически становится переменной - но так MVC работает и на других языках ...
источник
Причина особого обращения с «id» заключается в том, что он добавляется к сопоставлению маршрутов по умолчанию. Чтобы изменить это, перейдите в Global.asax.cs, и вы найдете следующую строку:
Измените его на:
источник
Или вы можете попробовать изменить тип параметра на строку, а затем преобразовать строку в целое число в методе. Я новичок в MVC, но считаю, что вам нужны объекты, допускающие значение NULL, в вашем списке параметров, как еще контроллер укажет, что такой параметр не был предоставлен? Так...
источник