Url.Action met un & amp; dans mon URL, comment puis-je résoudre ce problème?

89

Je veux envoyer les variables itemId et entityModel à ActionResult CreateNote:

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

avec ce javascript:

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

Cependant, l'URL envoyée est

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

je veux envoyer

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

Comment puis-je empêcher Url.Action de placer le & devant la deuxième variable que je veux envoyer?

Niek de Klein
la source
Qu'est-ce qui vous fait penser que ce &n'est pas correct?
Oded le
1
Parce que quand je regarde le ActionResult avec un point d'arrêt, quand j'ai localhost: 1304 / Administration / blue / en-gb / Entity / CreateNote? ModelEntity = Phrase & amp; itemId = 44 modelEntity = Phrase et itemId = null. Quand je les retourne en javascript et que j'obtiens localhost: 1304 / Administration / blue / en-gb / Entity / CreateNote? ItemId = 44 & amp; modelEntity = Phrase itemId = 44 et modelEntity = null. C'est pourquoi je pense que cela a à voir avec le & amp;
Niek de Klein
4
@Oded - parce que les données sont insérées dans JavaScript, pas HTML.
Quentin

Réponses:

126

Je n'ai pas remarqué hier que vous aviez &pensé que c'était l'éditeur SO qui avait changé cela. Essayez d'envelopper votre Url.Action()dans un @Html.Raw()pour éviter l'encodage de &.

Ou bien seulement Url.Action()le bit contrôleur / action et passer les deux paramètres en tant que données post plutôt que directement sur l'url, jQuery devrait trier les & pour vous de cette façon.

K. Bob
la source
43
Cette solution fonctionne, mais pourquoi Url.Action est-elle même encodée? Parlez de comportement inattendu.
Jerry
13

Je pense que votre problème est Model.meta.PostAction- est-ce que cette propriété eststring ?

Si tel est le cas, je suppose que vous l'ajoutez à la page avec soit:

  • Le rasoir: @Model.meta.PostAction
  • Moteur de vue ASP: <%:Model.meta.PostAction%>

Les deux encodent automatiquement cette chaîne pour vous.

Pour résoudre ce problème, utilisez @Html.Raw()/ <%=(qui ne codent pas tous les deux) ou faites de la PostActionpropriété un IHtmlStringqui sait qu'elle a déjà été codée:

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