ASP.NET MVC-将参数传递给控制器
我有一个具有操作方法的控制器,如下所示:
public class InventoryController : Controller { public ActionResult ViewStockNext(int firstItem) { // Do some stuff } }
当我运行它时,我得到一个错误说明:
The parameters dictionary does not contain a valid value of type 'System.Int32' for parameter 'firstItem'. To make a parameter optional its type should either be a reference type or a Nullable type.
我曾经在某一点上工作过,于是决定尝试不带参数的功能。发现控制器不是持久性的,我将参数放回去,现在当我调用方法时它拒绝识别参数。
我正在使用以下url语法来调用操作:
http://localhost:2316/Inventory/ViewStockNext/11
有什么主意为什么会出现此错误以及我需要怎么做才能解决该错误?
我试过在类中添加另一个采用整数的方法,但由于相同的原因它也会失败。我尝试添加一个需要一个字符串的字符串,并且该字符串设置为null。我尝试添加一个不带参数的方法,效果很好,但是当然不适合我的需求。
解决方案
我们需要按照{controller} / {action} / {firstItem}的路线设置路由。如果我们在
global.asax.cs文件中将路由保留为默认的
{controller} / {action} / {id},那么我们将需要传递
id`。
routes.MapRoute( "Inventory", "Inventory/{action}/{firstItem}", new { controller = "Inventory", action = "ListAll", firstItem = "" } );
...或者类似的东西。
要改写Jarret Meyer的答案,我们需要将参数名称更改为'id'或者添加如下所示的路由:
routes.MapRoute( "ViewStockNext", // Route name "Inventory/ViewStockNext/{firstItem}", // URL with parameters new { controller = "Inventory", action = "ViewStockNext" } // Parameter defaults );
原因是默认路由仅查找没有参数或者名为" id"的参数的操作。
编辑:嘿,没关系Jarret发布后添加了一个路线示例。
或者,我们可以尝试将参数类型更改为字符串,然后在方法中将字符串转换为整数。我是MVC的新手,但我相信我们需要在参数列表中添加可为空的对象,否则控制器将如何指示未提供此类参数?所以...
public ActionResult ViewNextItem(string id)...
public ActionResult ViewNextItem(int?id)使id整数成为可为null的类型,无需进行string <-> int转换。
还有另一种方法可以做到这一点(在Stephen Walther的Pager示例中有更详细的描述
本质上,我们可以在视图中创建一个链接:
Html.ActionLink("Next page", "Index", routeData)
在routeData中,我们可以指定名称/值对(例如,routeData [" page"] = 5),在控制器Index函数中,相应的参数将接收该值。那是,
public ViewResult Index(int? page)
将以5的形式传递页面。我必须承认,字符串("页面")自动变成变量是很不寻常的,但这也是MVC在其他语言中的工作方式...