Url.Action pone un & amp; en mi URL, ¿cómo puedo solucionar esto?

90

Quiero enviar las variables itemId y entityModel al ActionResult CreateNote:

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

con este javascript:

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

Sin embargo, la URL que se envía es

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

Quiero enviar

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

¿Cómo puedo evitar que Url.Action ponga & delante de la segunda variable que quiero enviar?

Niek de Klein
fuente
¿Qué te hace pensar que eso &no está bien?
Oded
1
Porque cuando miro ActionResult con un punto de interrupción, cuando tengo localhost: 1304 / Administration / blue / en-gb / Entity / CreateNote? ModelEntity = Phrase & amp; itemId = 44 modelEntity = Phrase y itemId = null. Cuando les doy la vuelta en javascript y obtengo localhost: 1304 / Administration / blue / en-gb / Entity / CreateNote? ItemId = 44 & amp; modelEntity = Phrase itemId = 44 y modelEntity = null. Por eso creo que tiene que ver con el & amp;
Niek de Klein
4
@Oded: porque los datos se insertan en JavaScript, no en HTML.
Quentin

Respuestas:

127

Ayer no me di cuenta de que había &pensado que era el editor de SO lo había cambiado. Intente envolver su Url.Action()en un @Html.Raw()para evitar el código de &.

O, alternativamente, solo Url.Action()el controlador / bit de acción y pasar los dos parámetros como datos de publicación en lugar de directamente en la URL, jQuery debería ordenar los & 's de esa manera.

K. Bob
fuente
43
Esta solución funciona, pero ¿por qué Url.Action incluso se codifica? Habla sobre comportamientos inesperados.
Jerry
13

Creo que tu problema es Model.meta.PostAction: ¿esa propiedad esstring ?

Si es así, supongo que lo vas a agregar a la página con:

  • Maquinilla de afeitar: @Model.meta.PostAction
  • Motor de vista ASP: <%:Model.meta.PostAction%>

Ambos codifican automáticamente esa cadena por ti.

Para solucionarlo, use @Html.Raw()/ <%=(ambos no codifican) o haga que la PostActionpropiedad IHtmlStringsepa que ya ha sido codificada:

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