web-dev-qa-db-fra.com

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

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?

81
Niek de Klein

Je n'ai pas remarqué hier que vous aviez & Je pensais que c'était l'éditeur SO qui avait changé cela. Essayez de mettre votre Url.Action() dans une fonction @Html.Raw() pour empêcher l'encodage de &.

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

117
K. Bob

Je pense que votre problème est avec Model.meta.PostAction - cette propriété est-elle un string?

Si oui, alors je suppose que vous l'ajoutez à la page avec:

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

Les deux codent automatiquement cette chaîne pour vous.

Pour le corriger, utilisez @Html.Raw()/<%= (Les deux ne codent pas) ou faites de la propriété PostAction une IHtmlString qui sait qu'elle est déjà été codé:

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