我有一个带有动作方法的控制器,如下所示:
public class InventoryController : Controller
{
public ActionResult ViewStockNext(int firstItem)
{
// Do some stuff
}
}
当我运行它时,我收到一个错误说明:
参数字典不包含参数'firstItem'的类型'System.Int32'的有效值。要使参数可选,其类型应该是引用类型或Nullable类型。
我让它在某一点工作,我决定尝试没有参数的功能。发现控制器不是持久的我将参数重新放入,现在它在调用方法时拒绝识别参数。
我正在使用此url语法来调用操作:
http://localhost:2316/Inventory/ViewStockNext/11
任何想法为什么我会得到这个错误以及我需要做些什么来修复它?
我已经尝试添加另一个方法,它将一个整数带到类中,它也因为同样的原因而失败。我尝试添加一个带字符串的字符串,并将字符串设置为null。我尝试添加一个没有参数的工作,但工作正常,但当然它不适合我的需要。
答案 0 :(得分:101)
您的路由需要按{controller}/{action}/{firstItem}
的方式设置。如果您将路由选择保留为{controller}/{action}/{id}
文件中的默认global.asax.cs
,那么您需要传递id
。
routes.MapRoute(
"Inventory",
"Inventory/{action}/{firstItem}",
new { controller = "Inventory", action = "ListAll", firstItem = "" }
);
......或接近它的东西。
答案 1 :(得分:77)
你可以将firstItem改为id,它会起作用
您可以更改global.asax上的路由(我不推荐)
并且,不敢相信没有人提到这一点,你可以致电:
http://localhost:2316/Inventory/ViewStockNext?firstItem=11
在@ Url.Action中将是:
@Url.Action("ViewStockNext", "Inventory", new {firstItem=11});
取决于你正在做什么的类型,最后一个会更合适。 此外,您应该考虑不执行ViewStockNext操作,而是使用带索引的ViewStock操作。 (我的2点)
答案 2 :(得分:15)
要重新定义Jarret Meyer's answer,您需要将参数名称更改为“id”或添加如下路线:
routes.MapRoute(
"ViewStockNext", // Route name
"Inventory/ViewStockNext/{firstItem}", // URL with parameters
new { controller = "Inventory", action = "ViewStockNext" } // Parameter defaults
);
原因是默认路由只查找没有参数的动作或名为'id'的参数。
编辑:嘿,没关系,Jarret在发布后添加了一个路线示例。
答案 3 :(得分:7)
public ActionResult ViewNextItem(int? id)
使id
整数成为可空类型,不需要字符串< - > int转换。
答案 4 :(得分:7)
Headspring创建了一个很好的库,允许您在操作的属性中为参数添加别名。这看起来像这样:
[ParameterAlias("firstItem", "id", Order = 3)]
public ActionResult ViewStockNext(int firstItem)
{
// Do some stuff
}
使用此功能,您无需仅为处理不同的参数名称而更改路由。该库还支持多次应用它,因此您可以映射多个参数拼写(在重构时非常方便而不会破坏您的公共界面)。
答案 5 :(得分:4)
或使用路线属性:
public class InventoryController : Controller
{
[Route("whatever/{firstItem}")]
public ActionResult ViewStockNext(int firstItem)
{
int yourNewVariable = firstItem;
// ...
}
}
答案 6 :(得分:1)
还有另一种方法可以实现这一点(在Stephen Walther的Pager example
中详细描述基本上,您在视图中创建了一个链接:
Html.ActionLink("Next page", "Index", routeData)
在routeData中,您可以指定名称/值对(例如,routeData [“page”] = 5),并在控制器索引函数中对应的参数接收值。也就是说,
public ViewResult Index(int? page)
将页面传递为5.我不得不承认,字符串(“page”)自动成为变量是很不寻常的 - 但这也是MVC在其他语言中的工作方式......
答案 7 :(得分:1)
使用ASP.NET核心标记助手功能:
<a asp-controller="Home" asp-action="SetLanguage" asp-route-yourparam1="@item.Value">@item.Text</a>
答案 8 :(得分:0)
或者,您可以尝试将参数类型更改为字符串,然后将字符串转换为方法中的整数。我是MVC的新手,但我相信你的参数列表中需要可以为空的对象,控制器如何表明没有提供这样的参数?所以......
public ActionResult ViewNextItem(string id)...
答案 9 :(得分:0)
对“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" });