Truyền tham số cho bộ điều khiển từ @ Html.ActionLink MVC 4


109

Trong dòng này:

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

Tôi gặp lỗi thời gian chạy sau trên blogPostId:

Từ điển tham số chứa mục nhập rỗng cho tham số 'blogPostId' thuộc loại không có giá trị 'System.Int32' cho phương thức 'System.Web.Mvc.ActionResult BlogReplyCommentAdd (Int32, Nop.Web.Models.Blogs.BlogPostModel, Boolean)' trong 'Nop.Web.Controllers.BlogController'. Một tham số tùy chọn phải là một kiểu tham chiếu, một kiểu nullable hoặc được khai báo như một tham số tùy chọn. Tên tham số: tham số

Tôi đã chỉ định một giá trị cho điều này ở trên cùng, chẳng hạn như

    @{         
        var blogPostId = Model.Id;          
     }

Bộ điều khiển của tôi:

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

Tôi có làm điều gì sai? Hãy cho tôi một ví dụ.

Câu trả lời:


257

Bạn đang sử dụng quá tải sai của trình Html.ActionLinktrợ giúp. Những gì bạn nghĩ routeValueslà thực sự htmlAttributes! Chỉ cần nhìn vào HTML được tạo, bạn sẽ thấy rằng thuộc tính href của neo này trông không như bạn mong đợi.

Đây là những gì bạn đang sử dụng:

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

và đây là những gì bạn nên sử dụng:

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

Ngoài ra, có một vấn đề rất nghiêm trọng khác với mã của bạn. RouteValue sau:

replyblogPostmodel = Model

Bạn không thể chuyển các đối tượng phức tạp như thế này vào ActionLink. Vì vậy, hãy loại bỏ nó và cũng xóa BlogPostModeltham số khỏi hành động của bộ điều khiển của bạn. Bạn nên sử dụng blogPostIdtham số để truy xuất mô hình từ bất kỳ nơi nào mô hình này được duy trì hoặc nếu bạn muốn từ bất kỳ nơi nào bạn truy xuất mô hình trong hành động GET:

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

Theo như vấn đề ban đầu của bạn có liên quan đến quá tải sai, tôi khuyên bạn nên viết trình trợ giúp của mình bằng cách sử dụng các tham số được đặt tên:

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

Giờ đây, không chỉ mã của bạn dễ đọc hơn mà bạn sẽ không bao giờ có sự nhầm lẫn giữa các ô nhiễm quá tải mà Microsoft đã tạo ra cho những người trợ giúp đó.


Bạn cần thay đổi nhận xét controllerNameactionName
webdeveloper

@DarinDimitrov: làm thế nào để chuyển mô hình làm tham số?
NetraSW

1
@ DarinDimitrov, @ webdeveloper: Tôi có cần đề cập đến [httppost] trên actionresult không?
NetraSW

@NetraSW, bạn không nên [HttpPost]thực hiện hành động này vì liên kết đang gửi yêu cầu GET. [HttpPost]có nghĩa là hành động trình điều khiển của bạn chỉ có thể truy cập được khi có yêu cầu ĐĂNG.
Darin Dimitrov

@DarinDimitrov: HOw tôi có thể làm cho điều này xảy ra? mô hình gửi giá trị propeties trống. Xin vui lòng hướng dẫn cho tôi.
NetraSW

12

Tôi phải chuyển hai tham số như:

/ Bộ điều khiển / Hành động / Param1Value / Param2Value

Cách này:

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

sẽ tạo url này

/ Controller / Action / Param1Value? Param2Name = Param2Value

Tôi đã sử dụng phương pháp giải quyết bằng cách hợp nhất tham số hai trong tham số một và tôi nhận được những gì tôi muốn:

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

Va tôi lây :

/ Bộ điều khiển / Hành động / Param1Value / Param2Value


Rõ ràng, điều này xảy ra khi Param1Value là null. Tôi vừa gặp phải vấn đề tương tự.
AFract

3

Bạn có thể chuyển các giá trị bằng cách sử dụng bên dưới.

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

Bộ điều khiển:

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

Và URL trông giống như

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

0

Vấn đề phải là với giá trị Model.Id là null. Bạn có thể xác nhận bằng cách gán một giá trị, ví dụ:

@{         
     var blogPostId = 1;          
 }

Nếu lỗi biến mất, thì bạn cần đảm bảo rằng Id kiểu máy của bạn có giá trị trước khi chuyển nó sang chế độ xem


1
Không, đó không phải là vấn đề.
Darin Dimitrov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.