参数字典包含非可空类型’System.Int32’的参数’id’的空条目

我正在构建我的第一个MVC应用程序,我在数据库中有一个包含3列的表:

  1. Id→主键
  2. 用户名
  3. 密码

当我点击编辑链接编辑一条记录时,它抛出以下exception:

参数字典包含非可空类型’System.Int32’的参数’id’的空条目,用于’MvcApplication1.Controllers.UserController’中的方法’System.Web.Mvc.ActionResult Edit(Int32)’。 可选参数必须是引用类型,可空类型,或者声明为可选参数。 参数名称:参数

这是我的编辑代码:

public ActionResult Edit(int id, User collection) { UserDBMLDataContext db = new UserDBMLDataContext(); var q = from abc in db.User_Login_Details where abc.Id == id select abc; IList lst = q.ToList(); User_Login_Details userLook = (User_Login_Details)lst[0]; userLook.Username = collection.UserName; userLook.Password = collection.Password; db.SubmitChanges(); return RedirectToAction("Index"); } 

您期望URL中有id参数,但您没有提供。 如:

 http://yoursite.com/controller/edit/12 ^^ missing 

在您的WebApiConfig >> Register ()您必须更改为

 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } 

这里是routeTemplate ,添加了{action}

此错误意味着MVC框架无法找到您作为参数传递给Edit方法的id属性的值。

MVC在路由数据,查询字符串和表单值等位置搜索这些值。

例如,以下内容将在您的查询字符串中传递id属性:

 /Edit?id=1 

一种更好的方法是编辑路由配置,以便您可以将此值作为URL本身的一部分传递:

 /Edit/1 

MVC搜索参数值的过程称为模型绑定,它是MVC的最佳function之一。 您可以在此处找到有关模型绑定的更多信息。

表单上的操作方法是否指向/controller/edit/1

尝试使用以下其中一种:

 // the null in the last position is the html attributes, which you usually won't use // on a form. These invocations are kinda ugly Html.BeginForm("Edit", "User", new { Id = Model.Id }, FormMethod.Post, null) Html.BeginForm(new { action="Edit", controller="User", id = Model.Id }) 

或者在表单内添加隐藏的“Id”字段

 @Html.HiddenFor(m => m.Id) 

您收到该错误,因为ASP.NET MVC无法找到id参数值来提供action方法的id参数。

您需要将其作为URL的一部分传递(“/ Home / Edit / 123”),作为查询字符串参数(“/ Home / Edit?id = 123”)或作为POSTed参数传递(确保具有类似的HTML表单。

或者,您可以将id参数设置为可为空的int( Edit(int? id, User collection) {...} ),但如果id为null,则您将不知道要编辑的内容。

以防这有助于其他任何人; 如果您将“视图”作为“打开”选项卡,则Visual Studio中可能会发生此错误,该选项卡取决于参数。

关闭当前视图并启动您的应用程序,应用程序将启动“正常”; 如果您打开了一个视图,Visual Studio会将其解释为您想要运行当前视图。

只需将您的代码行更改为

 Edit 

从您调用此函数的位置将传递corect id

我有同样的错误,但对我来说,问题是我正在使用错误的GUID执行请求。 我错过了最后2个字符。

 360476f3-a4c8-4e1c-96d7-3c451c6c86 360476f3-a4c8-4e1c-96d7-3c451c6c865e