2013-01-04 1 views
76

Dans cette ligne:paramètre au contrôleur de @ Html.ActionLink MVC 4

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

Je reçois l'erreur d'exécution suivante sur blogPostId:

Le dictionnaire paramètres contient une entrée nulle pour le paramètre 'blogPostId' de type non-nullable 'System.Int32' pour la méthode 'System.Web.Mvc.ActionResult BlogReplyCommentAdd (Int32, Nop.Web.Models.Blogs.BlogPostModel, Boolean)' dans 'Nop.Web.Controller .BlogController '. Un paramètre facultatif doit être un type de référence , un type Nullable ou être déclaré en tant que paramètre facultatif . Nom du paramètre: paramètres

J'ai déjà une valeur attribuer à cet effet sur le dessus, comme

@{   
     var blogPostId = Model.Id;   
    } 

Mon contrôleur:

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

Est-ce que je fais quelque chose de mal? S'il vous plaît donnez-moi un exemple.

Répondre

191

Vous utilisez une mauvaise surcharge de l'aide Html.ActionLink. Ce que vous pensez est routeValues est actuellement htmlAttributes! Il suffit de regarder le code HTML généré, vous verrez que la propriété href de cette ancre ne ressemble pas à ce que vous attendez.

Voici ce que vous utilisez:

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

et voici ce que vous devez utiliser:

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

Aussi il y a un autre problème très grave avec votre code. Le routeValue suivant:

replyblogPostmodel = Model 

Vous ne pouvez pas passer peut-être des objets complexes comme celui-ci dans un ActionLink. Alors, débarrassez-vous-en et supprimez également le paramètre BlogPostModel de votre action de contrôleur. Vous devez utiliser le paramètre blogPostId pour récupérer le modèle où que ce modèle est persisté, ou si vous préférez d'où vous avez récupéré le modèle dans l'action GET:

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

En ce qui concerne votre problème initial concerne le mauvais surcharge je vous recommande d'écrire vos aides à l'aide des paramètres nommés:

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

maintenant, non seulement que votre code est plus lisible, mais vous ne serez jamais avoir confusion entre les gazillions de Microsoft fait que les surcharges pour les aides.

+0

Vous devez modifier les commentaires 'controllerName' et' actionName' – webdeveloper

+0

@DarinDimitrov: comment passer le modèle comme paramètre? – NetraSW

+0

@ DarinDimitrov, @ webdeveloper: Est-ce que je dois mentionner [httppost] sur actionresult? – NetraSW

0

Le problème doit être avec la valeur Model.Id qui est null. Vous pouvez confirmer en attribuant une valeur, par exemple

@{   
    var blogPostId = 1;   
} 

Si les disappers d'erreur, alors u besoin de vous assurer que votre modèle Id a une valeur avant de passer à la vue

+1

Non, ce n'est pas le problème. –

9

je dois passer deux paramètres comme:

/Contrôleur/Action/Param1Value/Param2Value

De cette façon:

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

va générer cette URL

/Contrôleur/Action/Par ? Am1Value Param2Name = Param2Value

J'ai utilisé une méthode de contournement par le paramètre fusionnant deux dans le paramètre un et je reçois ce que je voulais:

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

Et je reçois:

/contrôleur/Action/Param1Value/Param2Value

+0

C'est très étrange. Plus d'explications serait cool –

Questions connexes