【问题标题】:The parameters dictionary contains a null entry for parameter 'idd' of non-nullable type 'System.Int32'参数字典包含不可为空类型“System.Int32”的参数“idd”的空条目
【发布时间】:2015-05-12 12:43:11
【问题描述】:

我是新来学习 MVC 的。我遇到了这个错误,我找不到解决方案。

我的控制器看起来像这样:

public class EmployeeDataController : Controller
{
    public ActionResult Details(int idd)
    {
        EmployeeDataContext edc = new EmployeeDataContext();
        EmployeeData employee=  edc.employeedata.Single(emp => emp.id == idd);

        return View(employee);
    }
}

从浏览器(即http://localhost:4166/EmployeeData/details/1)执行详细信息方法时,我收到此错误:

参数字典包含“MvcDemo1.Controllers.EmployeeDataController”中方法“System.Web.Mvc.ActionResult Details(Int32)”的不可为空类型“System.Int32”的参数“idd”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数

任何帮助都可以很好地解决我的问题。


当我更新我的代码并尝试编译程序时,编译时没有错误,但是当我运行程序时,我得到了一个错误

EmployeeData employee=  edc.employeedata.Single(x=>x.id==id);

**在 EntityFramework.SqlServer.dll 中发生“System.Data.Entity.Core.EntityCommandExecutionException”类型的异常,但未在用户代码中处理

附加信息:执行命令定义时发生错误**

【问题讨论】:

  • Details方法中尝试用id替换idd
  • 你在哪里调用你的Details 方法?这就是要显示的代码
  • 你需要展示你是如何调用Details()方法的。您是否向其传递了一个名为 idd 且具有有效值的参数?
  • 它告诉您,当您调用 Details 操作时,您需要为 idd 提供一个值。你提供一个值吗?您如何调用该操作? URL 和/或表单帖子是什么样的?
  • @wasimali,默认路由有一个名为id 的参数(请参阅您的RouteConfig.cs 文件)。把Details()方法的参数改成id(不是idd)就可以了,不然就用/EmployeeData/details?idd=1调用方法

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


【解决方案1】:

当您访问诸如EmployeeData/details/1 之类的URL 时,MVC 将使用您的路由来映射控制器、操作方法和要使用的参数。默认情况下,您将拥有的路线如下所示:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

使用您的 URL,这表示将 EmployeeData 作为控制器,details 作为操作方法,1 作为名称为 id 的可选参数的值。您的参数称为idd,因此未映射。由于该参数被标记为可选,但它在您的 Details 方法中不可为空,因此会发生异常。

你有三种方法可以解决这个问题。

首先,您可以将路线更改为使用idd 而不是id

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{idd}",
    defaults: new { controller = "Home", action = "Index", idd = UrlParameter.Optional }
);

其次,您可以将Details 方法中的参数更改为id

public ActionResult Details(int id)...

最后,您可以将正在使用的 URL 更改为在发送的参数中显式:

localhost:4166/EmployeeData/details?idd=1

【讨论】:

    【解决方案2】:

    如果您使用默认路由配置 - 而不是简单地将您的操作参数重命名为 id

     public ActionResult Details(int id)
     {
         EmployeeDataContext edc = new EmployeeDataContext();
         EmployeeData employee = edc.employeedata.Single(emp=>emp.id == id);
    
         return View(employee);
     }
    

    您的参数名称id 应该与路由配置中的一个完全匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多