Pase el parámetro al controlador desde @ Html.ActionLink MVC 4

En esta línea:

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

Obtengo el siguiente error de tiempo de ejecución en blogPostId:

El diccionario de parámetros contiene una entrada nula para el parámetro ‘blogPostId’ del tipo no nulo ‘System.Int32’ para el método ‘System.Web.Mvc.ActionResult BlogReplyCommentAdd (Int32, Nop.Web.Models.Blogs.BlogPostModel, Boolean)’ en ‘Nop.Web.Controllers.BlogController’. Un parámetro opcional debe ser un tipo de referencia, un tipo anulable o ser declarado como un parámetro opcional. Nombre del parámetro: parámetros

Ya he asignado un valor para esto en la parte superior, como

  @{ var blogPostId = Model.Id; } 

Mi controlador:

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

¿Estoy haciendo algo mal? Por favor, dame un ejemplo.

Está utilizando una sobrecarga incorrecta del helper Html.ActionLink . ¡Lo que crees que es routeValues es en realidad htmlAttributes ! Basta con mirar el HTML generado, verá que la propiedad href de este ancla no se ve como espera que se vea.

Esto es lo que estás usando:

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

y esto es lo que deberías usar:

 @Html.ActionLink( "Reply", // linkText "BlogReplyCommentAdd", // actionName "Blog", // controllerName new { // routeValues blogPostId = blogPostId, replyblogPostmodel = Model, captchaValid = Model.AddNewComment.DisplayCaptcha }, null // htmlAttributes ) 

También hay otro problema muy serio con tu código. El siguiente routeValue:

 replyblogPostmodel = Model 

No es posible pasar objetos complejos como este en un ActionLink. Así que deshazte de él y también elimina el parámetro BlogPostModel de la acción de tu controlador. Debe usar el parámetro blogPostId para recuperar el modelo dondequiera que este modelo se mantenga, o si lo prefiere desde donde recuperó el modelo en la acción GET:

 public ActionResult BlogReplyCommentAdd(int blogPostId, bool captchaValid) { BlogPostModel model = repository.Get(blogPostId); ... } 

En lo que se refiere a su problema inicial con la sobrecarga equivocada, le recomendaría que escriba sus ayudantes utilizando parámetros con nombre:

 @Html.ActionLink( linkText: "Reply", actionName: "BlogReplyCommentAdd", controllerName: "Blog", routeValues: new { blogPostId = blogPostId, captchaValid = Model.AddNewComment.DisplayCaptcha }, htmlAttributes: null ) 

Ahora no solo su código es más legible, sino que nunca tendrá confusión entre los millones de sobrecargas que Microsoft hizo por esos ayudantes.

Tengo que pasar dos parámetros como:

/ Controller / Action / Param1Value / Param2Value

De esta manera:

 @Html.ActionLink( linkText, actionName, controllerName, routeValues: new { Param1Name= Param1Value, Param2Name = Param2Value }, htmlAttributes: null ) 

generará esta url

/ Controller / Action / Param1Value? Param2Name = Param2Value

Usé un método alternativo combinando el parámetro dos en el parámetro uno y obtengo lo que quería:

 @Html.ActionLink( linkText, actionName, controllerName, routeValues: new { Param1Name= "Param1Value / Param2Value" , }, htmlAttributes: null ) 

Y entiendo:

/ Controller / Action / Param1Value / Param2Value

El problema debe ser con el valor Model.Id que es nulo. Puede confirmar asignando un valor, por ej.

 @{ var blogPostId = 1; } 

Si el error desaparece, entonces debe asegurarse de que su Id del modelo tenga un valor antes de pasarlo a la vista.