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.

テーブルをモデル化する 2 つのクラスがあります。私は最初にコードを使用しました。以下は私のクラスのコードです。

 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正しく渡しているかどうかを確認してください。

アップデート。ここで、もう 1 つの方法をお試しください。名前idはルーティングに表示されますが、指定したアクションidではリクエストのパラメーターとして渡されます。この特定の問題は、名前を変更するだけで解決できます。アクションのパラメーターの名前を変更します。

public ActionResult Edit(int certId)

ビューで対応する更新を行います。

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

これにより、次の URL が生成されます。/Default4/Edit?certId=5

于 2012-11-16T08:24:50.437 に答える
0

Andrei が言ったように、あなたのエラーは、編集アクション メソッドへのリクエストを行う方法にある可能性があります。アクション リンクはビューで次のように表示されます。

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

これでエラーが解消されるはずです。

null 値を Edit アクション メソッドに渡すことを意図している場合 (これは疑問ですが、とにかく知っておくと便利です)、アクション メソッドを変更して null 許容 ID を許可します。

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