Url.Action помещает & amp; в моем URL-адресе, как я могу это решить?

90

Я хочу отправить переменные itemId и entityModel в ActionResult CreateNote:

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

с этим javascript:

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

Однако отправляемый URL-адрес

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

Я хочу отправить

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

Как я могу запретить Url.Action ставить & перед второй переменной, которую я хочу отправить?

Ник де Кляйн
источник
Что заставляет вас думать, что &это не нормально?
Oded
1
Потому что, когда я смотрю на ActionResult с точкой останова, когда у меня есть localhost: 1304 / Administration / blue / en-gb / Entity / CreateNote? ModelEntity = Phrase & amp; itemId = 44 modelEntity = Phrase и itemId = null. Когда я переворачиваю их в javascript и получаю localhost: 1304 / Administration / blue / en-gb / Entity / CreateNote? ItemId = 44 & amp; modelEntity = Phrase itemId = 44 и modelEntity = null. Вот почему я думаю, что это связано с & amp;
Niek de Klein
4
@Oded - потому что данные вставляются в JavaScript, а не в HTML.
Quentin

Ответы:

128

Вчера я не заметил, что вы &думали, что редактор SO это изменил. Попробуйте обернуть Url.Action()себя@Html.Raw() чтобы предотвратить кодирование &.

Или, в качестве альтернативы, только Url.Action()бит контроллера / действия и передать два параметра в качестве данных публикации, а не напрямую по URL-адресу, jQuery должен отсортировать & для вас таким образом.

К. Боб
источник
43
Это решение работает, но почему Url.Action вообще кодируется? Поговорим о неожиданном поведении.
Джерри
13

Я думаю, ваша проблема в Model.meta.PostActionтом, что это свойствоstring ?

Если это так, то я предполагаю, что вы добавляете его на страницу с помощью:

  • Бритва: @Model.meta.PostAction
  • Механизм просмотра ASP: <%:Model.meta.PostAction%>

Оба из них автоматически кодируют эту строку для вас.

Чтобы исправить это, либо используйте @Html.Raw()/ <%=(оба из которых не кодируются), либо сделайте PostActionсвойство, IHtmlStringкоторое знает, что оно уже было закодировано:

string actionUrl = Url.Action("CreateNote", new { cmd = "Save", itemId = itemId, modelEntity = modelEntity});
Model.meta.PostAction = new HtmlString(actionUrl);
Кит
источник