ส่งผ่านพารามิเตอร์ไปยังคอนโทรลเลอร์จาก @ Html.ActionLink MVC 4


110

ในบรรทัดนี้:

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

ฉันได้รับข้อผิดพลาดรันไทม์ต่อไปนี้ใน blogPostId:

พจนานุกรมพารามิเตอร์มีรายการ null สำหรับพารามิเตอร์ 'blogPostId' ของชนิดที่ไม่เป็นโมฆะ 'System.Int32' สำหรับวิธีการ 'System.Web.Mvc.ActionResult BlogReplyCommentAdd (Int32, Nop.Web.Models.Blogs.BlogPostModel, Boolean) ใน 'นพ. เว็บคอนโทรลเลอร์ BlogController'. พารามิเตอร์ที่เป็นทางเลือกต้องเป็นประเภทการอ้างอิงประเภทที่เป็นโมฆะหรือถูกประกาศเป็นพารามิเตอร์ทางเลือก ชื่อพารามิเตอร์: พารามิเตอร์

ฉันได้กำหนดค่าสำหรับสิ่งนี้แล้วด้านบนเช่น

    @{         
        var blogPostId = Model.Id;          
     }

ตัวควบคุมของฉัน:

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

ฉันทำอะไรผิดหรือเปล่า? โปรดยกตัวอย่าง

คำตอบ:


258

คุณใช้ตัวHtml.ActionLinkช่วยเกินพิกัดอย่างไม่ถูกต้อง สิ่งที่คุณคิดนั้นrouteValuesมีอยู่จริงhtmlAttributes! เพียงแค่ดู HTML ที่สร้างขึ้นคุณจะเห็นว่าคุณสมบัติ href ของจุดยึดนี้ไม่ได้มีลักษณะอย่างที่คุณคาดหวัง

นี่คือสิ่งที่คุณใช้:

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

และนี่คือสิ่งที่คุณควรใช้:

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

นอกจากนี้ยังมีปัญหาที่ร้ายแรงอีกอย่างเกี่ยวกับรหัสของคุณ เส้นทางต่อไปนี้ค่า:

replyblogPostmodel = Model

คุณไม่สามารถส่งผ่านวัตถุที่ซับซ้อนเช่นนี้ได้ใน ActionLink ดังนั้นกำจัดมันและลบBlogPostModelพารามิเตอร์ออกจากการกระทำของคอนโทรลเลอร์ของคุณ คุณควรใช้blogPostIdพารามิเตอร์เพื่อดึงโมเดลจากที่ใดก็ตามที่โมเดลนี้ยังคงอยู่หรือหากคุณต้องการจากที่ใดก็ตามที่คุณดึงโมเดลในแอ็คชัน GET:

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

เท่าที่ปัญหาเริ่มต้นของคุณเกี่ยวข้องกับการโอเวอร์โหลดที่ไม่ถูกต้องฉันขอแนะนำให้คุณเขียนตัวช่วยของคุณโดยใช้พารามิเตอร์ที่มีชื่อ:

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

ตอนนี้ไม่เพียง แต่โค้ดของคุณจะอ่านได้มากขึ้นเท่านั้น แต่คุณจะไม่มีความสับสนระหว่างการโอเวอร์โหลดที่ Microsoft สร้างขึ้นสำหรับผู้ช่วยเหล่านั้น


คุณต้องเปลี่ยนความคิดเห็นcontrollerNameและactionName
เว็บ

@DarinDimitrov: วิธีส่งโมเดลเป็นพารามิเตอร์
NetraSW

1
@ DarinDimitrov, @ webdeveloper: ฉันต้องพูดถึง [HTTppost] ใน actionresult หรือไม่
NetraSW

@NetraSW คุณไม่ควรมีการ[HttpPost]ดำเนินการเนื่องจากลิงก์กำลังส่งคำขอ GET [HttpPost]หมายความว่าการดำเนินการของคอนโทรลเลอร์ของคุณสามารถเข้าถึงได้ด้วยคำขอ POST เท่านั้น
Darin Dimitrov

@DarinDimitrov: ฉันจะทำให้สิ่งนี้เกิดขึ้นได้อย่างไร model ส่งค่า propeties ว่างเปล่า ช่วยชี้แนะด้วยครับ.
NetraSW

12

ฉันต้องผ่านสองพารามิเตอร์เช่น:

/ Controller / Action / Param1Value / Param2Value

ทางนี้:

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

จะสร้าง url นี้

/ Controller / Action / Param1Value? Param2Name = Param2Value

ฉันใช้วิธีการแก้ปัญหาโดยการรวมพารามิเตอร์สองในพารามิเตอร์หนึ่งและฉันได้สิ่งที่ฉันต้องการ:

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

และฉันได้รับ:

/ Controller / Action / Param1Value / Param2Value


เห็นได้ชัดว่าสิ่งนี้เกิดขึ้นเมื่อ Param1Value เป็นโมฆะ ฉันเพิ่งเจอปัญหาเดียวกัน
หลัง

3

คุณสามารถส่งผ่านค่าได้โดยใช้ด้านล่าง

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

ตัวควบคุม:

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

และ URL ดูเหมือนว่า

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

0

ปัญหาต้องมีค่า Model.Id ซึ่งเป็นโมฆะ คุณสามารถยืนยันได้โดยกำหนดค่าเช่น

@{         
     var blogPostId = 1;          
 }

หากข้อผิดพลาดหายไปคุณต้องตรวจสอบให้แน่ใจว่ารหัสรุ่นของคุณมีค่าก่อนที่จะส่งไปยังมุมมอง


1
ไม่นั่นไม่ใช่ปัญหา
Darin Dimitrov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.