Передайте параметр контроллеру из @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)
{}


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

555   3  

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

    Ничего не найдено.