Url.Action inserisce un & amp; nel mio URL, come posso risolverlo?


90

Voglio inviare le variabili itemId e entityModel a ActionResult CreateNote:

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

con questo javascript:

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

Tuttavia, l'URL inviato è

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

Voglio inviare

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

Come posso impedire a Url.Action di mettere il segno & davanti alla seconda variabile che voglio inviare?


Cosa ti fa pensare che &non sia OK?
Oded

1
Perché quando guardo ActionResult con un punto di interruzione, quando ho localhost: 1304 / Administration / blue / en-gb / Entity / CreateNote? ModelEntity = Phrase & amp; itemId = 44 modelEntity = Phrase e itemId = null. Quando li giro in javascript e ottengo localhost: 1304 / Administration / blue / en-gb / Entity / CreateNote? ItemId = 44 & amp; modelEntity = Phrase itemId = 44 e modelEntity = null. Ecco perché penso che abbia a che fare con il & amp;
Niek de Klein

4
@Oded - perché i dati vengono inseriti in JavaScript, non in HTML.
Quentin

Risposte:


128

Ieri non ho notato che avevi &pensato che fosse l'editore SO aveva cambiato le cose. Prova a avvolgere il tuo Url.Action()in un @Html.Raw()per evitare che la codifica di &.

O in alternativa solo Url.Action()il bit di controllo / azione e passa i due parametri come dati di post piuttosto che direttamente sull'URL, jQuery dovrebbe risolvere il 's per te in questo modo.


43
Questa soluzione funziona, ma perché Url.Action viene codificato? Parla di comportamenti inaspettati.
Jerry

13

Penso che il tuo problema sia con Model.meta.PostAction- quella proprietà è una string?

In tal caso, la mia ipotesi sarebbe che lo stai aggiungendo alla pagina con:

  • Rasoio: @Model.meta.PostAction
  • Motore di visualizzazione ASP: <%:Model.meta.PostAction%>

Entrambi codificano automaticamente quella stringa per te.

Per risolverlo, usa @Html.Raw()/ <%=(entrambi non codificano) o rendi la PostActionproprietà una IHtmlStringche sa che è già stata codificata:

string actionUrl = Url.Action("CreateNote", new { cmd = "Save", itemId = itemId, modelEntity = modelEntity});
Model.meta.PostAction = new HtmlString(actionUrl);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.