web-dev-qa-db-fra.com

Transmettez le 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 de paramètres contient une entrée null 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)' in 'Nop.Web.Controllers.BlogController'. Un paramètre facultatif doit être un type de référence, un type nullable ou déclaré en tant que paramètre facultatif. Nom du paramètre: paramètres

J'ai déjà assigné une valeur pour cela en plus, 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.

96
NetraSW

Vous utilisez une surcharge incorrecte de l’assistant Html.ActionLink . Ce que vous pensez être routeValues est en réalité htmlAttributes! Il suffit de regarder le code HTML généré pour voir que la propriété href de cet 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
)
_

En outre, votre code pose un autre problème très grave. La routeValue suivante:

_replyblogPostmodel = Model
_

Vous ne pouvez pas éventuellement transmettre des objets complexes comme celui-ci dans un ActionLink. Donc, débarrassez-vous-en et supprimez également le paramètre BlogPostModel de l'action de votre contrôleur. Vous devez utiliser le paramètre blogPostId pour extraire le modèle de l'endroit où ce modèle est persisté ou, si vous préférez, de l'endroit où vous avez extrait 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 lié à une surcharge incorrecte, je vous recommanderais d'écrire vos assistants à l'aide de 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 votre code est plus lisible, mais vous n'aurez jamais de confusion entre les milliards de surcharges que Microsoft a créées pour ces assistants.

234
Darin Dimitrov

Je dois passer deux paramètres comme:

/ Controller/Action/Param1Value/Param2Value

Par ici:

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

va générer cette URL

/ Controller/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:

/ Controller/Action/Param1Value/Param2Value

12
MuniR

Vous pouvez transmettre des valeurs en utilisant ce qui suit.

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

Manette:

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
2
Vijay Vj

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 l'erreur disparaît, vous devez vous assurer que l'ID de votre modèle a une valeur avant de la transmettre à la vue.

0
sawe