Передать параметр контроллеру из @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)» в 'Нет.Веб.Контроллеры.БлогКонтроллер'. Необязательный параметр должен быть ссылочным типом, типом, допускающим значение NULL, или быть объявленным как необязательный параметр. Имя параметра: параметры

Я уже присвоил этому значение сверху, например

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

Также есть еще одна очень серьезная проблема с вашим кодом. Следующее значение маршрута:

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: у меня нет репозитория, который дает мне подробную информацию о модели по идентификатору. Как добавить модель в репозиторий. Это может показаться вам глупым вопросом. Но мне нужно знать, как я могу это сделать? - person NetraSW; 04.01.2013
comment
Вы уже сделали это в действии контроллера, которое отображало это представление. Вы откуда-то извлекли свою модель, чтобы передать ее в представление, не так ли? Таким образом, вы можете использовать тот же код в своем действии BlogReplyCommentAdd для извлечения модели из того же места. - person Darin Dimitrov; 04.01.2013

Мне нужно передать два параметра, например:

/Контроллер/Действие/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

person MuniR    schedule 24.08.2016
comment
По-видимому, это происходит, когда Param1Value имеет значение null. Я только что столкнулся с той же проблемой. - 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, которое равно null. Вы можете подтвердить, присвоив значение, например

@{         
     var blogPostId = 1;          
 }

Если ошибка исчезнет, ​​вам нужно убедиться, что идентификатор вашей модели имеет значение, прежде чем передавать его в представление.

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