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?

Niek de Klein
quelle
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.

K. Bob
quelle
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);
Keith
quelle