ASP.NET MVC-将参数传递给控制器

时间:2020-03-06 14:57:24  来源:igfitidea点击:

我有一个具有操作方法的控制器,如下所示:

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在其他语言中的工作方式...