我有以下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
);
答案 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
然后路由的操作未获得下一个/
。