Передайте параметр контролеру від @ Html.ActionLink MVC 4


109

У цьому рядку:

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

Я отримую таку помилку виконання на blogPostId:

Словник параметрів містить нульовий запис для параметра 'blogPostId' ненульового типу 'System.Int32' для методу 'System.Web.Mvc.ActionResult BlogReplyCommentAdd (Int32, Nop.Web.Models.Blogs.BlogPostModel, Boolean)' у 'Nop.Web.Controllers.BlogController'. Необов’язковий параметр повинен бути еталонним типом, нульовим типом або оголошуватися як необов'язковий параметр. Назва параметра: параметри

Я вже призначив для цього значення на вершині, такі як

    @{         
        var blogPostId = Model.Id;          
     }

Мій контролер:

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

Я щось роблю не так? Надайте, будь ласка, приклад.

Відповіді:


257

Ви використовуєте неправильне перевантаження 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
)

Також є ще одна дуже серйозна проблема з вашим кодом. Наступний маршрутValue:

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
webdeveloper

@DarinDimitrov: як передавати модель як параметр?
NetraSW

1
@ DarinDimitrov, @ webdeveloper: Чи потрібно згадати про [httppost] в результатах actionres?
NetraSW

@NetraSW, у вас не повинно бути [HttpPost]дії, оскільки посилання надсилає GET-запит. [HttpPost]означає, що ваша дія контролера доступна лише за запитом POST.
Дарин Димитров

@DarinDimitrov: HOW Я можу зробити це випадково? модель надсилає значення властивості порожніми. Будь ласка, направляйте мене.
NetraSW

12

Я маю пройти два параметри на кшталт:

/ Контролер / Дія / Param1Value / Param2Value

Сюди:

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

створить цю URL-адресу

/ Контролер / Дія / Param1Value? Param2Name = Param2Value

Я використав метод вирішення способу, об'єднавши параметр два в параметр один, і я отримав те, що хотів:

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

І я отримую:

/ Контролер / Дія / Param1Value / Param2Value


Мабуть, це відбувається, коли Param1Value є нульовим. Я щойно стикався з тією ж проблемою.
AFract

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;          
 }

Якщо помилка відхиляється, вам потрібно переконатися, що у вашої моделі Id є значення, перш ніж передати її на вигляд


1
Ні, це не проблема.
Дарин Димитров
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.