“参数字典包含参数的空条目” - 如何修复?

时间:2010-03-23 13:00:37

标签: c# asp.net asp.net-mvc

我正在尝试实施一个编辑页面,以便管理员修改数据库中的数据。不幸的是,我遇到了一个错误。

以下代码:

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= "" }
);

但我仍然收到错误。

7 个答案:

答案 0 :(得分:44)

productId(在您的默认路由中)的空字符串将被框架解析为空条目,并且由于int不允许null ...你是得到错误。

变化:

public ViewResult Edit(int productId)

public ViewResult Edit(int? productId)

如果您希望允许调用者不必传入产品ID,那么根据您的路由配置方式看起来就像您想要做的那样。

您还可以重新配置默认路由,以便在未提供productId时传递一些已知的默认值:

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

答案 1 :(得分:14)

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

解决方案实际上是我的索引视图具有以下代码。

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

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

public ViewResult Edit(int productId)

将我的索引视图更改为

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

解决了问题

答案 2 :(得分:6)

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

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;
                   }
           //...
        }
        // ...
    }
}

答案 3 :(得分:4)

productId应限制为int类型。

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

答案 4 :(得分:1)

也许您忘记在视图中传递所需数据(在本例中为'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>

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

答案 5 :(得分:0)

标准的“int”类(int32)不接受空值,并且在这种情况下它会使从空字符串的转换失败到int并尝试为其赋值null。

我可能会看一下你想要完成的事情 - 如果你试图强迫管理员为他们提供一个productID来编辑数据库中的那条记录,我会考虑把它放到Request对象或其他一些方法可以提供更多功能。

答案 6 :(得分:0)

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

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

    //Or proceed as normal
}

如果这是您访问页面时遇到的错误,这也很好,因为您需要有一个ID,(例如......人们不应该将URL放在地址栏中)然后将参数设置为可选值。

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