将Html.ActionLink与RouteValues一起使用

时间:2011-12-03 17:05:04

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

我有以下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 Details(Int32)'in   '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
    );

2 个答案:

答案 0 :(得分:10)

将action参数更改为int ProductId。

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

您的控制器必须获取“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
);

见最后一行。

答案 1 :(得分:1)

如果你拨打/你正在呼叫控制器/Product/Details?ProductId=1的网址,你将Product字符设置为控制器,动作和id(参数)之间的分隔符但是包含文字Details?ProductId=1然后路由的操作未获得下一个/