Passa il parametro al controller da @ Html.ActionLink MVC 4

In questa riga:

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

Ottengo il seguente errore di runtime su blogPostId:

Il dizionario dei parametri contiene una voce nulla per il parametro ‘blogPostId’ di tipo non annullabile ‘System.Int32’ per il metodo ‘System.Web.Mvc.ActionResult BlogReplyCommentAdd (Int32, Nop.Web.Models.Blogs.BlogPostModel, Boolean)’ in ‘Nop.Web.Controllers.BlogController’. Un parametro facoltativo deve essere un tipo di riferimento, un tipo nullable o essere dichiarato come parametro facoltativo. Nome del parametro: parametri

Ho già assegnato un valore per questo in alto come

  @{ var blogPostId = Model.Id; } 

Il mio controller:

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

Sto facendo qualcosa di sbagliato? Per favore, fammi un esempio

Si sta utilizzando un sovraccarico errato Html.ActionLink . Quello che pensi sia routeValues è in realtà htmlAttributes ! Osserva l’HTML generato, vedrai che la proprietà href di questo anchor non sembra come ti aspetti.

Ecco cosa stai usando:

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

ed ecco cosa dovresti usare:

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

Inoltre c’è un altro problema molto serio con il tuo codice. Il seguente routeValue:

 replyblogPostmodel = Model 

Non è ansible passare oggetti complessi come questo in ActionLink. Quindi sbarazzarsi di esso e rimuovere anche il parametro BlogPostModel dall’azione del controller. È necessario utilizzare il parametro blogPostId per recuperare il modello da qualsiasi punto in cui questo modello viene mantenuto o se si preferisce da qualsiasi punto in cui è stato richiamato il modello nell’azione GET:

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

Per quanto riguarda il problema di sovraccarico sbagliato, ti consiglio di scrivere i tuoi aiutanti usando i parametri denominati:

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

Ora non solo il tuo codice è più leggibile, ma non avrai mai confusione tra i miliardi di sovraccarichi prodotti da Microsoft per quegli aiutanti.

Devo passare due parametri come:

/ Controller / Azione / Param1Value / Param2Value

Per di qua:

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

genererà questo URL

/ Controller / Azione / Param1Value? Param2Name = Param2Value

Ho usato un metodo di soluzione alternativa unendo il parametro due nel parametro uno e ottengo ciò che volevo:

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

E ottengo:

/ Controller / Azione / Param1Value / Param2Value

Il problema deve essere con il valore Model.Id che è null. È ansible confermare assegnando un valore, ad es

 @{ var blogPostId = 1; } 

Se l’errore scompare, è necessario accertarsi che l’Id del modello abbia un valore prima di passarlo alla vista