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

110

В этой строке:

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

Я получаю следующую ошибку времени выполнения на blogPostId:

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

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

    @{         
        var blogPostId = Model.Id;          
     }

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

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

Я делаю что-то неправильно? Приведите, пожалуйста, пример.

NetraSW
источник

Ответы:

258

Вы используете неправильную перегрузку 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 сделала для этих помощников.

Дарин Димитров
источник
Вам нужно изменить комментарии controllerNameиactionName
webdeveloper
@DarinDimitrov: как передать модель в качестве параметра?
NetraSW 04
1
@ DarinDimitrov, @ webdeveloper: Мне нужно упомянуть [httppost] в actionresult?
NetraSW 04
@NetraSW, у вас не должно быть элемента [HttpPost]в действии, потому что ссылка отправляет запрос GET. [HttpPost]означает, что действие вашего контроллера доступно только с помощью запроса POST.
Дарин Димитров
@DarinDimitrov: Как я могу это сделать? модель отправляет значение свойства пустым. Пожалуйста, направь меня.
NetraSW 04
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

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

@{         
     var blogPostId = 1;          
 }

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

пилить
источник
1
Нет, проблема не в этом.
Дарин Димитров