126 votes

Passer un paramètre au contrôleur depuis @Html.ActionLink MVC 4

Dans cette ligne :

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

J'obtiens l'erreur d'exécution suivante sur blogPostId :

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

J'ai déjà attribué une valeur pour cela en haut, comme par exemple

    @{         
        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 ? Veuillez me donner un exemple.

296voto

Darin Dimitrov Points 528142

Vous utilisez une surcharge erronée de la fonction Html.ActionLink aide. Ce que vous pensez est routeValues est en fait htmlAttributes ! Il suffit de regarder le 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 devriez utiliser :

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

Il y a aussi un autre problème très sérieux avec votre code. La routeValue suivante :

replyblogPostmodel = Model

Il est impossible de transmettre des objets complexes de ce type dans un ActionLink. Ainsi se débarasser de lui et enlever également le BlogPostModel de votre action de contrôleur. Vous devez utiliser l'option blogPostId pour récupérer le modèle à partir de l'endroit où ce modèle est persistant, ou si vous préférez à partir de l'endroit 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 avec la mauvaise surcharge, je vous recommande d'écrire vos aides en utilisant des paramètres nommés :

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

Non seulement votre code est plus lisible, mais vous n'aurez jamais de confusion entre les milliards de surcharges que Microsoft a créées pour ces aides.

12voto

MuniR Points 371

Je dois passer deux paramètres comme :

/Contrôleur/Action/Param1Value/Param2Value

Par ici :

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

générera cette url

/Contrôleur/Action/Param1Value?Param2Name=Param2Value

J'ai utilisé une méthode de contournement en fusionnant le paramètre deux dans le paramètre un et j'ai obtenu 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

7voto

Vijay Vj Points 67

Vous pouvez transmettre des valeurs en utilisant les méthodes suivantes.

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

Contrôleur :

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

Et l'URL ressemble à

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

0voto

sawe Points 346

Le problème doit provenir de la valeur Model.Id qui est nulle. Vous pouvez confirmer en assignant une valeur, par exemple

@{         
     var blogPostId = 1;          
 }

Si l'erreur disparaît, alors vous devez vous assurer que votre modèle Id a une valeur avant de le passer à la vue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X