0

我在 asp.net MVC 3 中创建了一个 CRUD 应用程序。索引页面在表中显示了我数据库中的所有数据。但是,当我单击编辑、详细信息或删除此错误时,我得到:

 The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Delete(Int32)' in 'cpd.Controllers.Default4Controller'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.

我有两个类来模拟我的表。我首先使用了代码,下面是我的课程的代码。

 public class cpd_certificates
{

        [Key]
        public int CertificateNo { get; set; }
        public int QuizNo { get; set; }


        public DateTime? DateReceived { get; set; }
        public DateTime? DatePaid { get; set; }
        public string Mark { get; set; }
        public int? AccreditationNo { get; set; }


        public int? ID { get; set; }
        public virtual cpd_recipients Recipients { get; set; }

}

 public class cpd_recipients
{
        [Key]
    public int ID { get; set; }
    public string OpNo { get; set; }
    [Required]
    [StringLength(50, ErrorMessage = "{0} cannot exceed {1} characters")]
    public string LastName { get; set; }
    public string Initials { get; set; }
    public string Title { get; set;}
    public string Address1 {get; set;}
    public string Address2 {get; set;}
    public string Address3 {get; set;}
    public string Address4 {get; set;}
    public string Country {get; set;}

    public string email {get; set;}

}

这映射为 0..1 到许多。我的流利的API如下:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<cpd_certificates>()
            .HasOptional(x => x.Recipients);
    }

部分控制器代码:

 public ActionResult Edit(int id)
    {
        cpd_certificates cpd_certificates = db.Cert.Find(id);
        ViewBag.ID = new SelectList(db.CPD, "ID", "OpNo", cpd_certificates.ID);
        return View(cpd_certificates);
    }

// POST: /Default4/Edit/5

 public ActionResult Edit(cpd_certificates cpd_certificates)
    {
        if (ModelState.IsValid)
        {
            db.Entry(cpd_certificates).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.ID = new SelectList(db.CPD, "ID", "OpNo", cpd_certificates.ID);
        return View(cpd_certificates);
    }

视图代码:

        @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })

地图路线:

 routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Default4", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

我该如何解决这个错误。我在这方面比较缺乏经验。

4

2 回答 2

1

该错误表明您没有传递recipient用户想要操作的对象的 ID(显然)作为操作的参数。换句话说,很可能在你的控制器中你有一个这样声明的动作:

public ActionResult Delete(int id)

并且当用户单击删除时,发送到服务器的请求中没有id参数。要更正此检查,请检查您如何发送请求、如何构造 url 以及是否id正确传递给它。

更新。这是您尝试的另一种方法。名称id出现在您的路由中,但是在您指定的id将作为请求参数传递的操作中。这个特殊问题可以通过简单的重命名来解决。重命名动作的参数:

public ActionResult Edit(int certId)

并对视图进行相应的更新:

@Html.ActionLink("Edit", "Edit", "Default4", new { certId = item.PrimaryKey })

这应该会产生以下网址:/Default4/Edit?certId=5

于 2012-11-16T08:24:50.437 回答
0

正如 Andrei 所说,您的错误可能在于您向 Edit 操作方法发出请求的方式。在您的视图中,您的操作链接应如下所示:

@Html.ActionLink("Edit", "Edit", "YourControllerName", new { @id = TheIDForTheObject })

这应该消除错误。

如果您的意图是允许将空值传递给 Edit 操作方法(我对此表示怀疑,但无论如何还是很高兴知道),然后更改您的操作方法以允许可为空的 id:

public ActionResult Edit(int? id)
{
    // Your implementation here
}
于 2012-11-16T08:47:49.583 回答