ASP.NET MVC – 将parameter passing给控制器

我有一个操作方法如下的控制器:

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

当我运行它时,我得到一个错误,指出:

参数字典中不包含参数“firstItem”的types“System.Int32”的有效值。 要使参数可选,其types应该是引用types或Nullabletypes。

我曾经在一点工作,我决定尝试没有参数的function。 发现控制器不是持久的,我把参数放回去,现在当我调用方法时,它拒绝识别参数。

我正在使用这个URL语法来调用该操作:

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

任何想法,为什么我会得到这个错误,我需要做什么来解决它?

我试着添加另一个方法,它采取了一个整数的类,它也失败了相同的原因。 我试着添加一个接受一个string,并将string设置为空。 我已经尝试添加一个没有参数,这工作正常,但当然不会满足我的需求。

您的路由需要根据{controller}/{action}/{firstItem} 。 如果您在global.asax.cs文件中将路由作为默认的{controller}/{action}/{id} ,那么您将需要传入id

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

…或接近的东西。

你可以把firstItem改成id,它会起作用

你可以改变global.asax上的路由(我不build议这样做)

而且,不能相信没有人提到这个,你可以打电话给:

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

在@ Url.Action将是:

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

取决于你在做什么的types,最后会更合适。 你也应该考虑不要做ViewStockNext操作,而应该考虑带索引的ViewStock操作。 (我的2cents)

要改写Jarret Meyer的答案 ,您需要将参数名称更改为“id”或添加如下的路线:

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

原因是默认路由只查找没有参数或称为“id”的参数。

编辑:嘿,没关系Jarret发布后添加了一个路由示例。

Headspring创build了一个不错的库,允许您在操作的属性中为参数添加别名。 这看起来像这样:

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

有了这个,你不必改变你的路由只是为了处理不同的参数名称。 该库也支持多次应用,因此您可以映射多个参数拼写(重构时方便,而不会破坏公共接口)。

你可以从Nuget中得到它,并在这里阅读Jeffrey Palermo的文章

public ActionResult ViewNextItem(int? id)使id整数为可为空的types,不需要string < – > int转换。

或者用Route Attribute来做:

 public class InventoryController : Controller { [Route(whatever/{firstItem})] public ActionResult ViewStockNext(int firstItem) { int yourNewVariable = firstItem; // ... } } 

还有另一种方法可以实现这一点(在Stephen Walther的寻呼机的例子中有更详细的描述

本质上,你在视图中创build一个链接:

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

在routeData中你可以指定名称/值对(例如,routeData [“page”] = 5),并且在控制器的索引函数中相应的参数接收该值。 那是,

 public ViewResult Index(int? page) 

页面传递为5.我不得不承认,string(“页面”)自动成为一个variables是非常不寻常的 – 但这也是MVC在其他语言中的工作原理。

“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" }); 

或者,您可以尝试将参数types更改为string,然后将该string转换为方法中的整数。 我是MVC的新手,但我相信你需要在你的参数列表中可为空的对象,如何将控制器指示没有这样的参数提供? 所以…

 public ActionResult ViewNextItem(string id)... 

使用ASP.NET Core Tag Helperfunction:

 <a asp-controller="Home" asp-action="SetLanguage" asp-route-yourparam1="@item.Value">@item.Text</a>