Url.Action coloca um & amp; na minha url, como posso resolver isso?

89

Quero enviar as variáveis ​​itemId e entityModel para ActionResult CreateNote:

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

com este javascript:

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

No entanto, o url que está sendo enviado é

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

eu quero enviar

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

Como posso evitar que Url.Action coloque o & na frente da segunda variável que desejo enviar?

Niek de Klein
fonte
O que te faz pensar que isso &não está certo?
Oded de
1
Porque quando eu olho para o ActionResult com um ponto de interrupção, quando tenho localhost: 1304 / Administration / blue / en-gb / Entity / CreateNote? ModelEntity = Phrase & amp; itemId = 44 modelEntity = Phrase e itemId = null. Quando eu os viro em javascript e obtenho localhost: 1304 / Administration / blue / en-gb / Entity / CreateNote? ItemId = 44 & amp; modelEntity = Phrase itemId = 44 and modelEntity = null. É por isso que acho que tem a ver com o & amp;
Niek de Klein
4
@Oded - porque os dados estão sendo inseridos em JavaScript, não HTML.
Quentin

Respostas:

126

Não notei ontem que você tinha &, pensei que o editor do SO tinha mudado isso. Tente embrulhar seu Url.Action()em um @Html.Raw()para evitar a codificação de &.

Ou, alternativamente, apenas Url.Action()o controlador / bit de ação e passar os dois parâmetros como dados de postagem em vez de diretamente na url, o jQuery deve resolver os & 's para você dessa forma.

K. Bob
fonte
43
Essa solução funciona, mas por que Url.Action é codificado? Fale sobre comportamento inesperado.
Jerry
13

Acho que seu problema é com Model.meta.PostAction- essa propriedade é uma string?

Se for assim, meu palpite é que você está adicionando à página com:

  • Navalha: @Model.meta.PostAction
  • Motor de visualização ASP: <%:Model.meta.PostAction%>

Ambos codificam automaticamente essa string para você.

Para corrigi-lo, use @Html.Raw()/ <%=(ambos não codificam) ou torne a PostActionpropriedade uma IHtmlStringque saiba que já foi codificada:

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