我在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
);
如何解决此错误。我对此缺乏经验。
答案 0 :(得分:1)
错误表示您没有传递用户想要操作的对象ID(显然是recipient
)作为操作的参数。换句话说,很可能在你的控制器中你有一个声明如下的动作:
public ActionResult Delete(int id)
当用户单击“删除”时,发送到服务器的请求中没有id
参数。要更正此问题,请检查您是如何发送请求的,如何构建网址以及是否正确地将id
传递给它。
更新。这是您尝试的另一种方式。名称id
出现在您的路由中,但是在您指定的操作中,id
将作为请求参数传递。可以通过简单的重命名解决此特定问题。重命名操作的参数:
public ActionResult Edit(int certId)
并在视图上进行相应的更新:
@Html.ActionLink("Edit", "Edit", "Default4", new { certId = item.PrimaryKey })
这应该会产生以下网址:/Default4/Edit?certId=5
答案 1 :(得分:0)
正如Andrei所说,您的错误可能与您对Edit操作方法的请求有关。您的操作链接在您的视图中应如下所示:
@Html.ActionLink("Edit", "Edit", "YourControllerName", new { @id = TheIDForTheObject })
这应该摆脱错误。
如果您的目的是允许将null值传递给Edit操作方法(我怀疑,但无论如何都很好),然后更改您的操作方法以允许可以为空的id:
public ActionResult Edit(int? id)
{
// Your implementation here
}