Meneruskan parameter ke pengontrol dari @ Html.ActionLink MVC 4

109

Di baris ini:

@Html.ActionLink("Reply", "BlogReplyCommentAdd", "Blog",
         new { blogPostId = blogPostId, replyblogPostmodel = Model,
         captchaValid = Model.AddNewComment.DisplayCaptcha })

Saya mendapatkan error runtime berikut di blogPostId:

Kamus parameter berisi entri null untuk parameter 'blogPostId' tipe non-nullable 'System.Int32' untuk metode 'System.Web.Mvc.ActionResult BlogReplyCommentAdd (Int32, Nop.Web.Models.Blogs.BlogPostModel, Boolean)' di 'Nop.Web.Controllers.BlogController'. Parameter opsional harus berupa tipe referensi, tipe nullable, atau dideklarasikan sebagai parameter opsional. Nama parameter: parameter

Saya sudah menetapkan nilai untuk ini di atas seperti

    @{         
        var blogPostId = Model.Id;          
     }

Pengontrol Saya:

 public ActionResult BlogReplyCommentAdd(int blogPostId, BlogPostModel model, bool captchaValid)
    {}

Apakah saya melakukan sesuatu yang salah? Tolong beri saya contoh.

NetraSW
sumber

Jawaban:

257

Anda menggunakan Html.ActionLinkhelper yang kelebihan beban . Apa yang Anda pikirkan routeValuessebenarnya htmlAttributes! Lihat saja HTML yang dihasilkan, Anda akan melihat bahwa properti href jangkar ini tidak terlihat seperti yang Anda harapkan.

Inilah yang Anda gunakan:

@Html.ActionLink(
    "Reply",                                                  // linkText
    "BlogReplyCommentAdd",                                    // actionName
    "Blog",                                                   // routeValues
    new {                                                     // htmlAttributes
        blogPostId = blogPostId, 
        replyblogPostmodel = Model, 
        captchaValid = Model.AddNewComment.DisplayCaptcha 
    }
)

dan inilah yang harus Anda gunakan:

@Html.ActionLink(
    "Reply",                                                  // linkText
    "BlogReplyCommentAdd",                                    // actionName
    "Blog",                                                   // controllerName
    new {                                                     // routeValues
        blogPostId = blogPostId, 
        replyblogPostmodel = Model, 
        captchaValid = Model.AddNewComment.DisplayCaptcha 
    },
    null                                                      // htmlAttributes
)

Juga ada masalah lain yang sangat serius dengan kode Anda. RouteValue berikut:

replyblogPostmodel = Model

Anda tidak mungkin melewatkan objek kompleks seperti ini di ActionLink. Jadi singkirkan dan hapus jugaBlogPostModel parameter dari tindakan pengontrol Anda. Anda harus menggunakan blogPostIdparameter untuk mengambil model dari mana pun model ini dipertahankan, atau jika Anda lebih suka dari mana pun Anda mengambil model dalam aksi GET:

public ActionResult BlogReplyCommentAdd(int blogPostId, bool captchaValid)
{
    BlogPostModel model = repository.Get(blogPostId);
    ...
}

Sejauh masalah awal Anda berkaitan dengan kelebihan beban yang salah, saya sarankan Anda menulis pembantu Anda menggunakan parameter bernama:

@Html.ActionLink(
    linkText: "Reply",
    actionName: "BlogReplyCommentAdd",
    controllerName: "Blog",
    routeValues: new {
        blogPostId = blogPostId, 
        captchaValid = Model.AddNewComment.DisplayCaptcha
    },
    htmlAttributes: null
)

Sekarang tidak hanya kode Anda lebih mudah dibaca tetapi Anda tidak akan pernah memiliki kebingungan antara berlebihnya beban yang dibuat Microsoft untuk para pembantu tersebut.

Darin Dimitrov
sumber
Anda perlu mengubah komentar controllerNamedanactionName
pengembang web
@DarinDimitrov: bagaimana cara melewatkan model sebagai parameter?
NetraSW
1
@ DarinDimitrov, @ webdeveloper: Apakah saya perlu menyebutkan [httppost] di actionresult?
NetraSW
@NetraW, Anda tidak boleh memiliki [HttpPost]tindakan karena tautan tersebut mengirimkan permintaan GET. [HttpPost]berarti tindakan pengontrol Anda hanya dapat diakses dengan permintaan POST.
Darin Dimitrov
@DarinDimitrov: BAGAIMANA saya dapat membuat ini terjadi? model mengirimkan nilai properti kosong. Mohon bimbingannya.
NetraSW
12

Saya harus melewati dua parameter seperti:

/ Controller / Action / Param1Value / Param2Value

Cara ini:

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= Param1Value, 
        Param2Name = Param2Value 
    },
    htmlAttributes: null
)

akan menghasilkan url ini

/ Controller / Action / Param1Value? Param2Name = Param2Value

Saya menggunakan metode solusi dengan menggabungkan parameter dua dalam parameter satu dan saya mendapatkan apa yang saya inginkan:

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= "Param1Value / Param2Value" ,      
    },
    htmlAttributes: null
)

Dan saya mendapatkan:

/ Controller / Action / Param1Value / Param2Value

MuniR
sumber
Tampaknya, ini terjadi jika Param1Value nihil. Saya baru saja mengalami masalah yang sama.
AFakt
3

Anda dapat memberikan nilai dengan menggunakan di bawah ini.

@Html.ActionLink("About", "About", "Home",new { name = ViewBag.Name }, htmlAttributes:null )

Pengontrol:

public ActionResult About(string name)
        {
            ViewBag.Message = "Your application description page.";
            ViewBag.NameTransfer = name;
            return View();
        }

Dan URL-nya terlihat seperti

http://localhost:50297/Home/About?name=My%20Name%20is%20Vijay
Vijay Vj
sumber
0

Masalahnya harus dengan nilai Model.Id yang null. Anda dapat mengonfirmasi dengan memberikan nilai, misalnya

@{         
     var blogPostId = 1;          
 }

Jika kesalahan hilang, Anda perlu memastikan bahwa Id model Anda memiliki nilai sebelum meneruskannya ke tampilan

sawe
sumber
1
Tidak, bukan itu masalahnya.
Darin Dimitrov