Ответ 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 сделала для этих помощников.