“参数字典包含参数的空条目” – 如何解决?

我试图实现一个编辑页面,以便pipe理员修改数据库中的数据。不幸的是我遇到了一个错误。

下面的代码:

public ViewResult Edit(int productId) { // Do something here } 

但我得到这个错误:

 "The parameters dictionary contains a null entry for parameter 'productId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ViewResult Edit(Int32)' in 'WebUI.Controllers.AdminController'. To make a parameter optional its type should be either a reference type or a Nullable type. Parameter name: parameters" 

我在Global.asax.cs改变了我的路线,如下所示:

  routes.MapRoute( "Admin", "Admin/{action}/{ productId}", new { controller = "Admin", action = "Edit", productId= "" } ); 

但我仍然得到错误。

productId空string(在你的默认路由中)将被框架parsing为一个空条目,并且由于int不允许为null …你会得到错误。

更改:

 public ViewResult Edit(int productId) 

 public ViewResult Edit(int? productId) 

如果你想允许调用者不必传入一个产品ID,这就是你想要做什么的基础上你的路线configuration的方式。

您也可以重新configuration您的默认路由,以便在没有提供productId时传递一些已知的默认路由:

 routes.MapRoute( "Admin", "Admin/{action}/{ productId}", new { controller = "Admin", action = "Edit", productId= -1 } 

在Pro ASP.Net中运行的SportStore示例之后,我遇到了同样的问题

该解决scheme实际上是我的索引视图有以下代码。

 @Html.ActionLink("Edit", "Edit", new { id=item.ProductID }) | 

但是我的控制器中的编辑方法被定义为

 public ViewResult Edit(int productId) 

改变我的索引视图来阅读

 @Html.ActionLink("Edit", "Edit", new { productId=item.ProductID }) | 

解决了这个问题

以下是如何忽略任何控制器方法调用的这种参数错误的方法:

 public class MyControllerBase { //... protected override void OnActionExecuted(ActionExecutedContext filterContext) { if (filterContext.Exception != null) { var targetSite = filterContext.Exception.TargetSite; if (targetSite.DeclaringType != null) if (targetSite.DeclaringType.FullName == typeof(ActionDescriptor).FullName) if (targetSite.Name == "ExtractParameterFromDictionary") // Note: may be changed in future MVC versions { filterContext.ExceptionHandled = true; filterContext.Result = new HttpStatusCodeResult((int)HttpStatusCode.BadRequest); return; } //... } // ... } } 

productId应该被限制为inttypes。

 new {controller="Admin", action="Edit"}, new {productId = @"\d+" } 

也许你忘了在视图中传递所需的数据(在本例中是'productId')。
我假设你尝试通过点击索引页面中的链接来访问详细信息,我也将其视为“View \ Admin \ index.cshtml”

  <td> @Html.ActionLink("Edit", "Edit", new { productId = item.ProductId }) | @Html.ActionLink("Details", "Details", new { productId = item.ProductId }) | //note the productId is filled by item.ProductId @Html.ActionLink("Delete", "Delete", new { productId = item.ProductId }) </td> 

不这样做会导致所有参数为空,从而导致错误。

标准的“int”类(int32)不接受空值,在这种情况下,它将从空string转换为int失败,并尝试给它赋值null。

我可能会看看你正在努力完成的任务 – 如果你试图强制pipe理员为他们提供一个productID来编辑数据库中的logging,我会考虑把它放到Request对象中或者一些其他的方法,会给一些更多的多function性。

在路线上更改它可能会暗示其他路线使用相同的url。 保持简单,覆盖所有基地。

 [HttpGet] public ActionResult ThePage(int id = -1) { if(id == -1) { return RedirectToAction("Index"); } //Or proceed as normal } 

如果这是你访问页面时得到的一个错误,这也是很好的,因为你需要一个id(例如,当用户不需要的时候把url放在地址栏中),然后设置参数设置为可选值。

编辑:对不起int,只要问的问题