Ich bin sehr verwirrt darüber, warum dieser Code
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })
Ergebnisse in diesem Link:
<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>
Der hidefocus
Teil ist das, was ich erreichen wollte, aber woher kommt der ?Length=4
?
asp.net-mvc
Mein Alter Ego
quelle
quelle
Antworten:
Die Länge = 4 stammt aus einem Versuch, ein Zeichenfolgenobjekt zu serialisieren. Ihr Code führt diese
ActionLink
Methode aus:Dies nimmt ein
string
Objekt "Home" für routeValues, das von der MVC-Installation nach öffentlichen Eigenschaften durchsucht wird, um sie in Routenwerte umzuwandeln. Im Fall einesstring
Objekts ist die einzige öffentliche EigenschaftLength
, und da mit einem Length-Parameter keine Routen definiert werden, werden der Eigenschaftsname und der Wert als Abfragezeichenfolgenparameter angehängt. Wenn Sie dies von einer Seite ausführen, die nicht darauf istHomeController
, wird wahrscheinlich ein Fehler über eine fehlendeAbout
Aktionsmethode ausgegeben. Versuchen Sie Folgendes:quelle
Url.Action()
. Der Wechsel vonUrl.Action("Action", "Controller", new { area = "" })
bisUrl.Action("Action", new { controller = "Controller", area = "" })
hält die Eigenschaft Länge angezeigt werden , .Html.ActionLink("About", "About", "Home", routeValues: null, htmlAttributes: new { hidefocus = "hidefocus" })
Ich habe dies gelöst, indem ich dem vierten Parameter vor der anonymen Deklaration (
new {}
) eine Null hinzugefügt habe, damit die folgende Methodenüberladung verwendet wird: (linkText, actionName, controllerName, routeValues, htmlAttributes):quelle
controller
und angebenarea
, damit die Length-Eigenschaft nicht in der URL angezeigt wird .routeValues
sondern nur im Bereich angeben . Zum Beispiel:Html.ActionLink("About", "About", "Home", new {@area = "Admin"}, new { hidefocus = "hidefocus" })
ActionLink
, dass MVC einen seltsamenLength=x
Parameter am Ende der URL einfügt, wenn Sie htmlAttributes nicht als letztes Argument von angeben . Wenn Sie dies beispielsweise auf eine Seite setzen und dann die Quelle Ihrer Seite anzeigen, werden Sie sehen, was ich meine:@Html.ActionLink("About", "About", "Home", new { area = "Admin" }, new { hidefocus = "hidefocus" })
@Html.ActionLink("About", "About", "Home", new { area = "Admin" })
Wenn Sie dencontroller
Eintrag in dasrouteValues
Feld einfügen, wird er niemalsLength=x
in die URL eingefügt.@
in@area = "Admin"
, nur damit Sie wissen.Sie haben vergessen, den Parameter HTMLAttributes hinzuzufügen.
Dies funktioniert ohne Änderungen:
quelle
Die Parameter für ActionLink sind nicht korrekt. Es wird versucht, den Wert "Home" anstelle des anonymen Typs als Routenwert zu verwenden.
Ich glaube, Sie müssen nur
new { }
odernull
als letzten Parameter hinzufügen .BEARBEITEN: Lesen Sie den Beitrag erneut und stellen Sie fest, dass Sie wahrscheinlich null als vorletzten Parameter und nicht als letzten angeben möchten.
quelle
Dies nimmt die Überladung auf: Zeichenfolge linkText, Zeichenfolge actionName, Zeichenfolge controllerName, Object routeValues, Object htmlAttributes
quelle
Bitte verwenden Sie die rechtsüberladene Methode mit fünf (5) Parametern. Beispiel:
quelle
Entfernen Sie einfach "Home" (Name des Controllers), damit der Code wie folgt lautet:
quelle
Mit Attributnamen:
quelle
Wie Jonathon Watney in einem Kommentar betonte, gilt dies auch für
Methoden. In meinem Fall befand ich mich in einer Create.cshtml , die auf die Post-Anfrage des entsprechenden Controllers + Create-Aktion abzielte , und hatte
Dabei wurde der Formularaktion beim Rendern der Querystring "? Length = 6" hinzugefügt . Ausgehend von Roryfs genehmigter Antwort und der Erkenntnis, dass die Stringlänge von "Create" 6 beträgt, habe ich dies schließlich gelöst, indem ich die explizite Aktionsspezifikation entfernt habe:
quelle
Möglicherweise hatten andere das gleiche Problem und müssen einen Klassenwert über HTMLAttributes parm angeben. Hier ist meine Lösung:
quelle
Die Suche nach einer Antwort auf meine Frage hat mich hier gelandet. Im Grunde ist es die Auswahl der richtigen Überlastung,
@Html.ActionLink
die zählt.Ich habe eine Überlastung ausgewählt, die ( ohne die letzte
null
) nicht vorhanden war undMVC
keine solche Überlastung aufwies, was zu einer falschen URL führte, wie sie im OP erwähnt wurde.Eine persönliche Anmerkung: Sie können
use
anonyme Typen nicht , dass Sie eine der overloads- verwenden können welche Sie existieren nicht? - stellen Sie sicher: es muss definiert werden!- Kam hier in Zeiten von MVC 5.2
quelle