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

В този ред:

@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)
    {}

Правя ли нещо нередно? Моля, дайте ми пример.


person NetraSW    schedule 04.01.2013    source източник


Отговори (4)


Използвате грешно претоварване на 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
)

Освен това има друг много сериозен проблем с вашия код. Следната routeValue:

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 направи за тези помощници.

person Darin Dimitrov    schedule 04.01.2013
comment
Трябва да промените коментарите controllerName и actionName - person webdeveloper; 04.01.2013
comment
@DarinDimitrov: как да предам модела като параметър? - person NetraSW; 04.01.2013
comment
@DarinDimitrov,@webdeveloper: Трябва ли да споменавам [httppost] на actionresult? - person NetraSW; 04.01.2013
comment
@NetraSW, не трябва да имате [HttpPost] в действието, защото връзката изпраща GET заявка. [HttpPost] означава, че вашето действие на контролера е достъпно само с POST заявка. - person Darin Dimitrov; 04.01.2013
comment
@DarinDimitrov: Как мога да направя това? моделът изпраща празна стойност на свойствата. Моля, насочете ме. - person NetraSW; 04.01.2013
comment
Вече ви казах, че не можете да изпращате сложни обекти с ActionLink. Прочете ли отговора ми? Повтарям: премахвате този параметър от вашите аргументи за действие и го извличате, като използвате стойността blogPostId от основното ви хранилище за данни. - person Darin Dimitrov; 04.01.2013
comment
@DarinDimitrov:Нямам хранилище, което да ми дава подробности за модела по ID. Как да добавя модел към хранилището. Може въпросът да изглежда глупав за вас. Но трябва да знам как мога да направя това? - person NetraSW; 04.01.2013
comment
Вече го направихте в действието на контролера, което изобрази този изглед. Взехте модела си отнякъде, за да го предадете на изгледа, нали? Така че можете да използвате същия код във вашето BlogReplyCommentAdd действие, за да извлечете модела от същото място. - person Darin Dimitrov; 04.01.2013

Трябва да предам два параметъра като:

/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

person MuniR    schedule 24.08.2016
comment
Очевидно това се случва, когато Param1Value е нула. Току що се сблъсках със същия проблем. - person AFract; 09.01.2019

Можете да предавате стойности, като използвате по-долу.

@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
person Vijay Vj    schedule 19.05.2019

Проблемът трябва да е със стойността Model.Id, която е нула. Можете да потвърдите, като зададете стойност, напр

@{         
     var blogPostId = 1;          
 }

Ако грешката изчезне, трябва да се уверите, че идентификаторът на вашия модел има стойност, преди да го предадете на изгледа

person sawe    schedule 04.01.2013
comment
Не, това не е проблемът. - person Darin Dimitrov; 04.01.2013