Sie verwenden eine falsche Überlastung des Html.ActionLink
Helfers. Was Sie denken, routeValues
ist tatsächlich htmlAttributes
! Schauen Sie sich einfach den generierten HTML-Code an. Sie werden feststellen, dass die href-Eigenschaft dieses Ankers nicht so aussieht, wie Sie es erwarten.
Folgendes verwenden Sie:
@Html.ActionLink(
"Reply", // linkText
"BlogReplyCommentAdd", // actionName
"Blog", // routeValues
new { // htmlAttributes
blogPostId = blogPostId,
replyblogPostmodel = Model,
captchaValid = Model.AddNewComment.DisplayCaptcha
}
)
und hier ist, was Sie verwenden sollten:
@Html.ActionLink(
"Reply", // linkText
"BlogReplyCommentAdd", // actionName
"Blog", // controllerName
new { // routeValues
blogPostId = blogPostId,
replyblogPostmodel = Model,
captchaValid = Model.AddNewComment.DisplayCaptcha
},
null // htmlAttributes
)
Es gibt auch ein anderes sehr ernstes Problem mit Ihrem Code. Der folgende routeValue:
replyblogPostmodel = Model
Sie können solche komplexen Objekte unmöglich in einem ActionLink übergeben. Entfernen Sie es also und entfernen Sie den BlogPostModel
Parameter aus Ihrer Controller-Aktion. Sie sollten den blogPostId
Parameter verwenden, um das Modell von jedem Ort abzurufen, an dem dieses Modell beibehalten wird, oder wenn Sie es vorziehen, von jedem Ort aus, an dem Sie das Modell in der GET-Aktion abgerufen haben:
public ActionResult BlogReplyCommentAdd(int blogPostId, bool captchaValid)
{
BlogPostModel model = repository.Get(blogPostId);
...
}
In Bezug auf Ihr anfängliches Problem mit der falschen Überlastung würde ich Ihnen empfehlen, Ihre Helfer mit benannten Parametern zu schreiben:
@Html.ActionLink(
linkText: "Reply",
actionName: "BlogReplyCommentAdd",
controllerName: "Blog",
routeValues: new {
blogPostId = blogPostId,
captchaValid = Model.AddNewComment.DisplayCaptcha
},
htmlAttributes: null
)
Jetzt ist Ihr Code nicht nur besser lesbar, sondern Sie werden auch nie mehr Verwirrung über die Unmengen von Überladungen haben, die Microsoft für diese Helfer vorgenommen hat.
controllerName
undactionName
[HttpPost]
in der Aktion haben, da der Link eine GET-Anfrage sendet.[HttpPost]
bedeutet, dass auf Ihre Controller-Aktion nur mit einer POST-Anforderung zugegriffen werden kann.Ich muss zwei Parameter übergeben wie:
Diesen Weg:
wird diese URL generieren
Ich habe eine Problemumgehungsmethode verwendet, indem ich Parameter zwei in Parameter eins zusammengeführt habe, und ich bekomme, was ich wollte:
Und ich bekomme:
quelle
Sie können Werte wie folgt übergeben.
Regler:
Und die URL sieht aus wie
quelle
Das Problem muss mit dem Wert Model.Id liegen, der null ist. Sie können dies bestätigen, indem Sie einen Wert zuweisen, z
Wenn der Fehler verschwindet, müssen Sie sicherstellen, dass Ihre Modell-ID einen Wert hat, bevor Sie ihn an die Ansicht übergeben
quelle