当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《ASP.NETMVC-将参数传递给控制器》经验,为你挑选了6个好方法。

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

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

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

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

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

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

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

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

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



1> Jarrett Meye..:

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

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

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


或者只是将"firstItem"重命名为"id"
另外,在MapRoute中添加约束对象是明智之举,如下所示:`new {firstItem = @"\ d"}`.这样它只会**接受参数是否是任何类型的数字.您可以根据需要修改正则表达式,甚至可以限制小数位数,如下所示:`new {firstItem = @"\ d {4}"}` - 现在它只能是4个数字.编辑:完全修改的MapRoute示例:http://jsfiddle.net/HJRgT/

2> Bart Calixto..:

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

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

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

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

在@ Url.Action中将是:

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

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


这正是我要找的东西:) thx

3> Matt Mitchel..:

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

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

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

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



4> Oskar Duvebo..:

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



5> Matthew Nich..:

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

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

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

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



6> Yar..:

或使用Route Attribute:

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

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有