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

时间:2013-08-05 07:34:04

标签: c# asp.net-mvc

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

  1. Id→主键
  2. 用户名
  3. 密码
  4. 当我点击编辑链接编辑一条记录时,它抛出以下异常:

      

    参数字典包含非可空类型'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");                  
    }
    

13 个答案:

答案 0 :(得分:32)

您希望网址中包含id参数,但您没有提供该参数。如:

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

答案 1 :(得分:12)

在你的 WebApiConfig>> Register () 你必须改为

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

此处routeTemplate添加了{action}

答案 2 :(得分:9)

此错误表示MVC框架无法找到您作为[{1}}方法的参数传递的id属性的值。

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

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

id

更好的方法是编辑routing configuration,以便将此值作为网址本身的一部分传递:

/Edit?id=1

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

答案 3 :(得分: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)

答案 4 :(得分:2)

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

您需要将其作为网址的一部分传递(“/ Home / Edit / 123”),作为查询字符串参数(“/ Home / Edit?id = 123”)或作为POSTed参数传递(make一定要在HTML表单中加上<input type="hidden" name="id" value="123" />

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

只需将您的代码行更改为

即可
<a href="~/Required/Edit?id=@item.id">Edit</a>
从您调用此函数的地方

将传递corect id

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

config.MapHttpAttributeRoutes()

答案 9 :(得分:0)

我也有同样的问题。我调查后发现路由模板中缺少{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 }
        );

答案 10 :(得分:0)

这对于已经正确完成所有事情的人仍然很有用。对于他们来说,“以上错误也可能由于引用不明确而引起”。

如果您的{-# LANGUAGE DataKinds, RankNTypes, PartialSignature, ScopedTypeVariables -#} type HasApp m = (HasDatabase m, HasSmtp m) class HasServant ... class (HasApp m, HasServant n) => RunForUser m n where runForUser :: Proxy (perms :: [Permission]) -> UserId -> m a -> n a server :: forall m n . (RunForUser m n, HasApp m) => Routes (AsServerT n) server = Routes { rFetchOrder = \userId orderId -> runForUser fetchOrderPerms userId -- -- NOTE: Had to manually annotate the type `m a` and had -- to use PartialTypeSignatures to avoid having to specify -- the type `a` again. -- (fetchOrderById orderId :: m _) , ... } 包含

Controller

还有

using System.Web.Mvc;

它将产生歧义,默认情况下,它将使用MVC using System.Web.Http; 设置代替RouteConfig的{​​{1}}设置。确保WebApiConfig通话只需要routing参考

答案 11 :(得分:0)

我遇到了相同的错误。

解决方案:我们将值传递给Controller的视图中的变量名称应与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);
            }

答案 12 :(得分:0)

将id参数设置为可为null的int:

public ActionResult Edit(int? id, User collection)

然后添加验证:

if (Id == null) ...