Url.Action umieszcza & amp; w moim adresie URL, jak mogę to rozwiązać?

90

Chcę wysłać zmienne itemId i entityModel do ActionResult CreateNote:

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

z tym javascript:

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

Jednak wysyłany adres URL to

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

chcę wysłać

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

Jak mogę uniemożliwić Url.Action umieszczanie znaku & przed drugą zmienną, którą chcę wysłać?

Niek de Klein
źródło
Dlaczego myślisz, że &to nie jest w porządku?
Oded
1
Ponieważ kiedy patrzę na ActionResult z punktem przerwania, kiedy mam localhost: 1304 / Administration / blue / en-gb / Entity / CreateNote? ModelEntity = Phrase & amp; itemId = 44 modelEntity = Phrase i itemId = null. Kiedy odwracam je w javascript i otrzymuję localhost: 1304 / Administration / blue / en-gb / Entity / CreateNote? ItemId = 44 & amp; modelEntity = Phrase itemId = 44 i modelEntity = null. Dlatego myślę, że ma to związek z & amp;
Niek de Klein,
4
@Oded - ponieważ dane są wstawiane do JavaScript, a nie HTML.
Quentin,

Odpowiedzi:

127

Nie zauważyłem wczoraj, że &myślałeś, że to redaktor SO to zmienił. Spróbuj zawinąć swój Url.Action()znak a, @Html.Raw()aby zapobiec kodowaniu &.

Lub alternatywnie tylko Url.Action()bit kontrolera / akcji i przekazanie tych dwóch parametrów jako danych pocztowych, a nie bezpośrednio na adres URL, jQuery powinien w ten sposób uporządkować &'s dla Ciebie.

K. Bob
źródło
43
To rozwiązanie działa, ale dlaczego Url.Action jest nawet kodowany? Porozmawiaj o nieoczekiwanym zachowaniu.
Jerry
13

Myślę, że twój problem dotyczy Model.meta.PostAction- czy to jest nieruchomość string?

Jeśli tak, to przypuszczam, że dodajesz go do strony za pomocą:

  • Brzytwa: @Model.meta.PostAction
  • Silnik widoku ASP: <%:Model.meta.PostAction%>

Oba automatycznie kodują ten ciąg.

Aby to naprawić, użyj @Html.Raw()/ <%=(oba nie kodują) lub spraw, aby PostActionwłaściwość IHtmlStringwiedziała, że ​​została już zakodowana:

string actionUrl = Url.Action("CreateNote", new { cmd = "Save", itemId = itemId, modelEntity = modelEntity});
Model.meta.PostAction = new HtmlString(actionUrl);
Keith
źródło