2013-01-04 13 views
76

In questa linea:parametro Passo al controller da @ Html.ActionLink MVC 4

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

ottengo il seguente errore di runtime su blogPostId:

Il dizionario parametri contiene una voce null per il parametro 'blogPostId' di tipo non annullabile 'System.Int32' per 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 opzionale . Nome del parametro: parametri

ho già assegnare un valore per questo in cima, come

@{   
     var blogPostId = Model.Id;   
    } 

mio controller:

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

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

risposta

191

Si sta utilizzando un sovraccarico di sbagliato dell'helper 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 si sta utilizzando:

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

ed ecco cosa dovreste 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 codice. Il seguente routeValue:

replyblogPostmodel = Model 

Non è possibile passare oggetti complessi come questo in ActionLink. Quindi sbarazzarsi di esso e rimuovere anche il parametro BlogPostModel dall'azione del controller. Si dovrebbe utilizzare il parametro blogPostId per recuperare il modello da dove questo modello viene mantenuto, o se si preferisce da dove è stato recuperato il modello nell'azione GET:

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

quanto riguarda il tuo problema iniziale è interessato con il male sovraccarico consiglierei di scrivere i tuoi collaboratori utilizzando parametri denominati:

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

Ora non solo che il codice è più leggibile, ma si avrà mai confusione tra i gazillions di sovraccarichi che Microsoft ha reso per quelle aiutanti.

+0

È necessario modificare i commenti 'controllerName' e' actionName' – webdeveloper

+0

@DarinDimitrov: come passare il modello come parametro? – NetraSW

+0

@ DarinDimitrov, @ webdeveloper: Devo menzionare [httppost] su actionresult? – NetraSW

0

Il problema deve essere con il valore Model.Id che è null. È possibile verificare assegnando un valore, ad esempio

@{   
    var blogPostId = 1;   
} 

Se le scompare l'errore, quindi u bisogno di assicurarsi che il modello di identificazione ha un valore prima di passarlo alla vista

+1

No, non è questo il problema. –

9

devo passare due parametri come:

/Controller/Azione/Param1Value/Param2Value

questo modo:

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

genererà questo URL

/Controller/Azione/Par ? Am1Value Param2Name = Param2Value

ho usato un metodo di soluzione unendo parametro due in un parametro e ottenere ciò che volevo:

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

e ottengo:

/Controller/Azione/Param1Valore/Param2Value

+0

Questo è molto strano. Altre spiegazioni sarebbero interessanti –

Problemi correlati