将Html.ActionLink与RouteValues一起使用

sea*_*tzg 10 model-view-controller asp.net-mvc asp.net-mvc-routing asp.net-mvc-3

我有以下Html:

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

这被呈现为:

<a href="/Product/Details?ProductId=1">My Product Name</a>
Run Code Online (Sandbox Code Playgroud)

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

参数字典包含非可空类型'System.Int32'的参数'id'的空条目,用于'MyProject.Controllers.ProductController'中的方法'System.Web.Mvc.ActionResult Details(Int32)'.可选参数必须是引用类型,可空类型,或者声明为可选参数.

参数名称:参数

我的路由似乎不喜欢"?ProductId = 1"查询字符串.

如果我改用:

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

我得到以下链接呈现:

<a href="/Product/Details/1">My Product Name</a>
Run Code Online (Sandbox Code Playgroud)

...单击时这可以正常工作.

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

我唯一的路线映射是:

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

gdo*_*ica 10

将action参数更改为int ProductId.

public ActionResult Details(int productId)
{
    return View("");
}
Run Code Online (Sandbox Code Playgroud)

你的控制器必须获得一个"id"参数,因为你声明它不是 nullable 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
);
Run Code Online (Sandbox Code Playgroud)

看到最后一行.