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

c# asp.net-mvc

300604 观看

11回复

3357 作者的声誉

我有一个控制器,其动作方法如下:

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

当我运行它时,我得到一个错误说明:

参数字典不包含参数'firstItem'的类型'System.Int32'的有效值。要使参数可选,其类型应为引用类型或Nullable类型。

我让它在某一点工作,我决定尝试没有参数的功能。发现控制器不是持久的我将参数重新放入,现在它在调用方法时拒绝识别参数。

我正在使用此url语法来调用该操作:

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

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

我已经尝试添加另一个方法,该方法将一个整数带到类中,它也因为同样的原因而失败。我尝试添加一个带字符串的字符串,并将字符串设置为null。我已经尝试添加一个没有参数,并且工作正常,但当然它不适合我的需要。

作者: Odd 的来源 发布者: 2008 年 10 月 1 日

回应 (11)


101

17015 作者的声誉

决定

您的路由需要按照以下方式设置{controller}/{action}/{firstItem}。如果你离开了路由作为默认{controller}/{action}/{id}在您的global.asax.cs文件,那么你将需要传递id

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

......或者接近那个的东西。

作者: Jarrett Meyer 发布者: 01.10.2008 01:46

15

24372 作者的声誉

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

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

原因是默认路由只查找没有参数的动作或名为'id'的参数。

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

作者: Matt Mitchell 发布者: 01.10.2008 01:50

0

587 作者的声誉

或者,您可以尝试将参数类型更改为字符串,然后将字符串转换为方法中的整数。我是MVC的新手,但我相信你的参数列表中需要可以为空的对象,控制器如何表明没有提供这样的参数?所以...

public ActionResult ViewNextItem(string id)...
作者: RAL 发布者: 10.12.2008 03:41

7

2038 作者的声誉

public ActionResult ViewNextItem(int? id)使id整数成为可空类型,不需要字符串< - > int转换。

作者: Oskar Duveborn 发布者: 25.01.2009 05:35

1

2423 作者的声誉

还有另一种方法可以实现(在Stephen Walther的Pager例子中有更详细的描述)

实际上,您在视图中创建了一个链接:

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

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

public ViewResult Index(int? page)

页面传递为5.我必须承认,字符串(“page”)自动变为变量是很不寻常的 - 但这也是MVC在其他语言中的工作方式......

作者: Felix 发布者: 11.10.2009 06:44

76

12610 作者的声誉

你可以将firstItem改为id,它会起作用

你可以改变global.asax上的路由(我不推荐)

并且,不敢相信没有人提到这一点,你可以致电:

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

在@ Url.Action中将是:

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

根据你所做的类型,最后一个会更合适。此外,您应该考虑不执行ViewStockNext操作,而是使用带索引的ViewStock操作。(我的2cents)

作者: Bart Calixto 发布者: 02.12.2011 10:46

0

558 作者的声誉

对“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" });
作者: Aristoteles 发布者: 19.01.2012 08:28

7

2765 作者的声誉

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

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

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

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

作者: Matthew Nichols 发布者: 12.09.2012 06:47

4

3205 作者的声誉

或使用Route属性执行:

public class InventoryController : Controller
{
    [Route("whatever/{firstItem}")]
    public ActionResult ViewStockNext(int firstItem)
    {
        int yourNewVariable = firstItem;
        // ...
    }
}
作者: Yar 发布者: 28.08.2015 01:28

0

126 作者的声誉

使用ASP.NET核心标记助手功能:

<a asp-controller="Home" asp-action="SetLanguage" asp-route-yourparam1="@item.Value">@item.Text</a>
作者: Sasha Yakobchuk 发布者: 04.04.2017 06:44

0

1 作者的声誉

感谢Bart Calixto(76):@ Url.Action(“ViewStockNext”,“Inventory”,new {firstItem = 11}); 我使用了@ Html.ActionLink(“编辑”,“编辑”,“用户”,item.Id), - 返回了null。一旦我将其更改为:@ Html.ActionLink(“编辑”,“编辑”,“用户”,新的{id = item.Id}),它就会将值返回到我的控制器方法。

作者: Ryno Pot 发布者: 25.02.2019 08:59
32x32