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

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

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

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

Словарь параметров содержит нулевую запись для параметра 'blogPostId' не-nullable типа '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)
    {}

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

Ответ 1

Вы используете неправильную перегрузку Html.ActionLink помощника. То, что вы думаете, routeValues на самом деле htmlAttributes! Посмотрите только на сгенерированный HTML-код, вы увидите, что это свойство anchor 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 сделала для этих помощников.

Ответ 2

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

/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

Ответ 3

Проблема должна быть со значением Model.Id, которое является нулевым. Вы можете подтвердить, назначив значение, например

@{         
     var blogPostId = 1;          
 }

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

Ответ 4

Вы можете передавать значения, используя ниже.

@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