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