Передайте параметр контроллеру из @Html.ActionLink MVC 4
В этой строке:
@Html.ActionLink("Reply", "BlogReplyCommentAdd", "Blog",
new { blogPostId = blogPostId, replyblogPostmodel = Model,
captchaValid = Model.AddNewComment.DisplayCaptcha })
Я получаю следующую ошибку во время выполнения на blogPostId:
словарь параметров содержит нулевую запись для параметра
'идентификатора, blogpostid' из необнуляемый тип System.Типа int32' для метода
- Система.Сеть.Mvc.ActionResult BlogReplyCommentAdd(Int32,
Ноп.Сеть.Модели.Блоги.BlogPostModel, Boolean) ' in
- Нет.Сеть.Контроллеры.BlogController'. Необязательный параметр должен быть
ссылочным типом, тип, допускающий значение null или быть объявлен как необязательный
параметр. Имя параметра: parameters
Я уже назначил значение для этого сверху, например
@{
var blogPostId = Model.Id;
}
Мой Контроллер:
public ActionResult BlogReplyCommentAdd(int blogPostId, BlogPostModel model, bool captchaValid)
{}
Я делаю что-то неправильно? Пожалуйста, приведите мне пример.
3 ответов:
вы используете неправильную перегрузки
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 )теперь не только в том, что ваш код более читабельным, но вы никогда не будет путаницы между gazillions из перегрузок, что Microsoft сделала для этих помощников.
Я должен передать два параметра, такие как:
/ 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
проблема должна быть со значением Model.Id который равен нулю. Вы можете подтвердить, присвоив значение, например
@{ var blogPostId = 1; }Если ошибка отклоняется, то u нужно убедиться, что Ваш идентификатор модели имеет значение перед передачей его в представление
Comments