【问题标题】:Using Html.ActionLink with RouteValues将 Html.ActionLink 与 RouteValues 一起使用
【发布时间】:2011-12-03 17:05:03
【问题描述】:

我有以下 HTML:

<%: Html.ActionLink(item.ProductName, "Details", "Product", new { item.ProductId }, null)%>

这被渲染为:

<a href="/Product/Details?ProductId=1">My Product Name</a>

但是,当我点击它时,我收到以下错误:

参数字典包含参数“id”的空条目 方法的不可空类型“System.Int32” 'System.Web.Mvc.ActionResult 详细信息(Int32)' 在 'MyProject.Controllers.ProductController'。可选参数必须 是引用类型、可为空的类型或被声明为可选项 范围。

参数名称:参数

我的路由似乎不喜欢“?ProductId=1”查询字符串。

如果我改用:

<%: Html.ActionLink(item.ProductName, string.Format("Details/{0}", item.ProductId), "Product", null, null)%>

我得到以下链接:

<a href="/Product/Details/1">My Product Name</a>

...点击后可以正常工作。

我在这里缺少一些基本的东西吗?我想使用 RouteValues,但我不明白为什么会抛出这个错误。如何让我的 Controller 方法接受查询字符串参数?

我拥有的唯一路线图是:

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 model-view-controller asp.net-mvc-routing


    【解决方案1】:

    将 action 参数更改为 int ProductId。

    public ActionResult Details(int productId)
    {
        return View("");
    }
    

    您的控制器必须获取一个“id”参数,因为您将其声明为 not 可为空的 int,因此当您发送 productId 时,它仍然与函数签名不匹配。
    不指定参数名时,路由默认在global.asax中将参数名改为id:

      routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
    

    查看最后一行。

    【讨论】:

    • 或者...如果我在 RouteValues 参数中添加“id =”: 然后我得到以下链接:我的产品名称 ...这也有效!
    • @seanfitzg,你是对的,但我猜你不希望你的所有参数名称都是“Id”...
    【解决方案2】:

    如果您调用/Product/Details?ProductId=1 之类的url,您正在将/ 字符设置为控制器、操作和id(参数)之间的分隔符,您正在调用控制器Product,但操作与文本@ 987654324@然后路由没有得到下一个/

    【讨论】:

    • 很遗憾,MapRoute 方法不接受“?”路由中的字符。
    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多