Url.Action setzt ein & amp; Wie kann ich das in meiner URL lösen?


89

Ich möchte die Variablen itemId und entityModel an ActionResult CreateNote senden:

public ActionResult CreateNote(
        [ModelBinder(typeof(Models.JsonModelBinder))]
        NoteModel Model, string cmd, long? itemId, string modelEntity)

mit diesem Javascript:

Model.meta.PostAction = Url.Action("CreateNote", new { cmd = "Save", itemId = itemId, modelEntity = modelEntity});

Die gesendete URL lautet jedoch

localhost:1304/Administration/blue/en-gb/Entity/CreateNote?modelEntity=Phrase&itemId=44     

Ich will etwas senden

localhost:1304/Administration/blue/en-gb/Entity/CreateNote?modelEntity=Phrase&itemId=44

Wie kann ich verhindern, dass Url.Action das & vor die zweite Variable stellt, die ich senden möchte?


Was lässt Sie denken, dass &das nicht in Ordnung ist?
Oded

1
Denn wenn ich das ActionResult mit einem Haltepunkt betrachte, wenn ich localhost habe: 1304 / Administration / blue / de-gb / Entity / CreateNote? ModelEntity = Phrase & amp; itemId = 44 modelEntity = Phrase und itemId = null. Wenn ich sie in Javascript umdrehe und localhost erhalte: 1304 / Administration / blue / de-gb / Entity / CreateNote? ItemId = 44 & amp; modelEntity = Phrase itemId = 44 und modelEntity = null. Deshalb denke ich, dass es mit dem & amp;
Niek de Klein

4
@Oded - weil die Daten in JavaScript und nicht in HTML eingefügt werden.
Quentin

Antworten:


125

Ich habe gestern nicht bemerkt, dass du &gedacht hast , dass der SO-Editor das geändert hat. Versuchen Sie, Ihr Url.Action()in ein @Html.Raw()zu wickeln , um den Encode von & zu verhindern.

Oder alternativ nur Url.Action()das Controller- / Aktionsbit und die beiden Parameter als Post-Daten anstatt direkt auf der URL übergeben, sollte jQuery die & 's auf diese Weise für Sie aussortieren.


43
Diese Lösung funktioniert, aber warum wird Url.Action überhaupt codiert? Sprechen Sie über unerwartetes Verhalten.
Jerry

13

Ich denke, Ihr Problem ist mit Model.meta.PostAction- ist diese Eigenschaft eine string?

Wenn ja, dann würde ich vermuten, dass Sie es der Seite hinzufügen mit:

  • Rasierer: @Model.meta.PostAction
  • ASP View Engine: <%:Model.meta.PostAction%>

Beide codieren diese Zeichenfolge automatisch für Sie.

Um dies zu beheben, verwenden Sie entweder @Html.Raw()/ <%=(beide codieren nicht) oder machen Sie die PostActionEigenschaft zu einer Eigenschaft IHtmlString, die weiß, dass sie bereits codiert wurde:

string actionUrl = Url.Action("CreateNote", new { cmd = "Save", itemId = itemId, modelEntity = modelEntity});
Model.meta.PostAction = new HtmlString(actionUrl);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.