28

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

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

当我单击编辑链接编辑记录时,它会引发以下异常:

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

这是我的编辑代码:

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

15 回答 15

42

您期望idURL 中有一个参数,但您没有提供一个参数。如:

http://yoursite.com/controller/edit/12
                                    ^^ missing
于 2013-08-05T07:38:56.530 回答
18

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

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

在这里routeTemplate,添加了{action}

于 2015-01-09T08:04:12.033 回答
11

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

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

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

/Edit?id=1

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

/Edit/1

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

于 2013-08-05T07:39:14.073 回答
4

表单上的操作方法是否指向/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)
于 2013-08-05T07:45:42.520 回答
3

您收到该错误是因为 ASP.NET MVC 找不到 id 参数值来为您的操作方法的 id 参数提供。

您需要将其作为 url 的一部分 ("/Home/Edit/123")、作为查询字符串参数 ("/Home/Edit?id=123") 或作为 POSTed 参数传递(确保有类似于<input type="hidden" name="id" value="123" />您的 HTML 表单中的内容)。

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

于 2013-08-05T07:42:26.210 回答
2

我也有同样的问题。我调查并发现路由模板中缺少 {action} 属性。

代码之前(有问题):

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

修复后(工作代码):

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
于 2019-03-31T02:36:25.127 回答
1

这对于那些一切都做对了但仍然面临问题的人可能很有用。对于他们来说,“上述错误也可能由于参考不明确而导致”。

如果你的Controller包含

using System.Web.Mvc;

并且

using System.Web.Http;

它将产生歧义,默认情况下它将使用 MVCRouteConfig设置而WebApiConfig不是routing. 确保WebAPI通话System.Web.Http只需要参考

于 2019-07-08T09:16:31.860 回答
1

我面临着同样的错误。

解决方案:我们向Controller传递值的视图中的变量名称应该与控制器端的变量名称匹配。

.csHtml(视图):

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

.cs(控制器方法):

 [HttpGet]
            public ActionResult Edit(int id)
            {
                EmployeeContext employeeContext = new EmployeeContext();
                Employee employee = employeeContext.Employees.Where(emp => emp.EmployeeId == id).First();
                return View(employee);
            }
于 2019-09-01T13:42:23.783 回答
1

使 id 参数为可为空的 int:

public ActionResult Edit(int? id, User collection)

然后添加验证:

if (Id == null) ...
于 2019-12-11T21:01:24.057 回答
0

以防万一这对其他人有帮助;如果您将视图作为打开的选项卡,并且该选项卡取决于参数,则此错误可能会在 Visual Studio 中发生。

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

于 2015-12-15T16:53:56.567 回答
0

只需将您的代码行更改为

<a href="~/Required/Edit?id=@item.id">Edit</a>

从你调用这个函数的地方,它将传递 corect id

于 2017-01-27T11:04:17.397 回答
0

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

360476f3-a4c8-4e1c-96d7-3c451c6c86
360476f3-a4c8-4e1c-96d7-3c451c6c865e
于 2018-01-05T14:37:25.413 回答
0

如果 appconfig 或 webconfig 中不存在属性路由,只需添加它

config.MapHttpAttributeRoutes()
于 2019-02-08T06:52:00.603 回答
0

如果您对为什么要id通过剃刀文件传递空值感到困惑,那么我的重载顺序错误。在这种情况下,您不必担心它可以为空。

例子:

这不会通过您的id,因为重载不在正确的位置:

@Html.ActionLink("Edit", "Edit", "Controller", new { @class = "btn btn-primary" }, new { @id = x.Id })

这是传递id的正确顺序,后面带有 html 属性:

@Html.ActionLink("Edit", "Edit", "Controller", new { @id = x.Id }, new { @class = "btn btn-primary" })
于 2021-10-07T20:43:09.690 回答
0

@Html.ActionLink(item.Name, "Edit", new { id = item.Id }) 注意给 ActionLink() 的参数是有序的。

  1. 第一个参数是文本字段在页面上显示。
  2. 第二个是动作 URL。
  3. 清单一供 ID 参考。
于 2022-02-07T13:22:58.733 回答