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

Nai*_*aim 38 c# asp.net asp.net-mvc

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

代码如下:

public ViewResult Edit(int productId) {
       // Do something here 
}
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

"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"
Run Code Online (Sandbox Code Playgroud)

我改变了我的路线Global.asax.cs:

 routes.MapRoute(
"Admin",
"Admin/{action}/{ productId}",
new { controller = "Admin", action = "Edit",  productId= "" }
);
Run Code Online (Sandbox Code Playgroud)

但我仍然得到错误.

Jus*_*ner 44

productId(在您的默认路由中)的空字符串将被框架解析为空条目,因为int不允许null......您将收到错误.

更改:

public ViewResult Edit(int productId)
Run Code Online (Sandbox Code Playgroud)

public ViewResult Edit(int? productId)
Run Code Online (Sandbox Code Playgroud)

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

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

routes.MapRoute( 
    "Admin", 
    "Admin/{action}/{ productId}", 
    new { controller = "Admin", action = "Edit",  productId= -1 } 
Run Code Online (Sandbox Code Playgroud)


Phi*_*ele 14

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

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

@Html.ActionLink("Edit", "Edit", new { id=item.ProductID }) |
Run Code Online (Sandbox Code Playgroud)

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

public ViewResult Edit(int productId)
Run Code Online (Sandbox Code Playgroud)

将我的索引视图更改为读取

@Html.ActionLink("Edit", "Edit", new { productId=item.ProductID }) |
Run Code Online (Sandbox Code Playgroud)

解决了这个问题


Vla*_*nko 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;
                   }
           //...
        }
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)