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


109

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 nullable '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 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.

Risposte:


257

Stai usando un sovraccarico sbagliato Html.ActionLinkdell'helper. Quello che pensi routeValuessia in realtà htmlAttributes! Basta guardare l'HTML generato, vedrai che la proprietà href di questo ancoraggio non ha l'aspetto che 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 è possibile passare oggetti complessi come questo in un ActionLink. Quindi sbarazzati di esso e rimuovi anche il BlogPostModelparametro dall'azione del controller. È necessario utilizzare il blogPostIdparametro per recuperare il modello da qualsiasi posizione in cui è presente il modello 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);
    ...
}

Per quanto riguarda il tuo problema iniziale con il sovraccarico sbagliato, ti consiglierei di scrivere i tuoi helper usando 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 che Microsoft ha creato per quegli helper.


È necessario modificare i commenti controllerNameeactionName
webdeveloper

@DarinDimitrov: come passare il modello come parametro?
NetraSW

1
@ DarinDimitrov, @ webdeveloper: Devo menzionare [exploreppost] su actionresult?
NetraSW

@NetraSW, non dovresti avere un [HttpPost]in azione perché il link sta inviando una richiesta GET. [HttpPost]significa che l'azione del controller è accessibile solo con una richiesta POST.
Darin Dimitrov

@DarinDimitrov: come posso far sì che questo succeda? il modello invia il valore delle proprietà vuoto. Per favore guidami.
NetraSW

12

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 alternativo unendo il parametro due nel parametro uno e ottengo quello che volevo:

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

E ottengo:

/ Controller / Azione / Param1Value / Param2Value


Apparentemente, questo accade quando Param1Value è nullo. Ho appena riscontrato lo stesso problema.
AFract

3

Puoi passare i valori utilizzando quanto segue.

@Html.ActionLink("About", "About", "Home",new { name = ViewBag.Name }, htmlAttributes:null )

controller:

public ActionResult About(string name)
        {
            ViewBag.Message = "Your application description page.";
            ViewBag.NameTransfer = name;
            return View();
        }

E l'URL sembra

http://localhost:50297/Home/About?name=My%20Name%20is%20Vijay

0

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

@{         
     var blogPostId = 1;          
 }

Se l'errore scompare, è necessario assicurarsi che l'ID del modello abbia un valore prima di passarlo alla vista


1
No, non è questo il problema.
Darin Dimitrov
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.