Передайте параметр controllerу из @ 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; } 

Мой controller:

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

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

Вы используете неправильную перегрузку помощника 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 из действия вашего controllerа. Вы должны использовать параметр blogPostId для извлечения модели из 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; } 

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

  • Создайте раскрывающийся список для MVC3 с использованием Entity Framework (.edmx Model) и Razor Views && Вставьте запись базы данных в несколько таблиц
  • Html.Textbox VS Html.TextboxFor
  • Добавить файлы CSS или JavaScript в макет из представлений или частичных представлений
  • MVC5 Razor html.dropdownlist для набора, выбранного, когда значение находится в массиве
  • Как добавить дополнительные пространства имен в страницы Razor вместо @using объявления?
  • Razor Views не видит System.Web.Mvc.HtmlHelper
  • Сохранение данных многих из многих отношений в MVC Создание представления
  • Строковая интерполяция в представлении «Бритва»?
  • Можно ли получить доступ к объекту MVC ViewBag из файла Javascript?
  • Render Razor Просмотр строки в ASP.NET Core
  • EditorTemplate для DropDownList
  • Давайте будем гением компьютера.