首页 文章

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

提问于
浏览
95

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

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

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

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

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

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

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

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

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

10 回答

  • 15

    您的路由需要按照 {controller}/{action}/{firstItem} 的方式设置 . 如果您将路由保留为 global.asax.cs 文件中的默认 {controller}/{action}/{id} ,则需要传入 id .

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

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

  • 7

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

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

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

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

    在@ Url.Action中将是:

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

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

  • 1

    要重新定义Jarret Meyer's answer,您需要将参数名称更改为'id'或添加如下路线:

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

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

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

  • 4

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

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

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

    您可以从Nuget获取它并阅读Jeffrey Palermo的文章here

  • 0

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

  • 0

    或使用Route属性执行:

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

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

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

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

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

    public ViewResult Index(int? page)
    

    page 传递为5.我不得不承认,它是如何在其他语言中使用MVC的...

  • 7

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

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

    public ActionResult ViewNextItem(string id)...
    
  • 76

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

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

相关问题