Probleme mit der Url.Aktion Helfer mit multiple-route-Werten
Ich bin derzeit an der Entwicklung einer ASP.NET MVC3-Anwendung in VS2010 und ich habe einige Probleme mit @Url.Action
Helfer. Ich habe eine ajax-Anfrage, wo ich diese Helfer:
var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })';
$.post(url).success(function(data) {
...
});
Das problem ist, dass der Wert url
nach ist dies /Controller/Action?a=a&b=b
beachten &
zwischen der route-Werten. Funktioniert das nicht, aber wenn ich das Tue:
var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })'.replace('amp;', '');
funktioniert es perfekt!!!
Mein handeln ist so etwas wie dieses:
public JsonResult Action(string a, string b)
{
...
}
Habe ich ausgetestet, meine app und auch die action aufgerufen wird-und auch a
ist "a"
, aber b
ist null
.
Ist dies das gewünschte Verhalten der Url.Action
? Ich denke nicht so. Bitte helft mir, was mache ich falsch? Sollte ich einen anderen parameter, um meine Url.Action
nennen? Vielen Dank im Voraus.
InformationsquelleAutor ecampver | 2013-03-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht Sie. Javascript identifiziert die & als geschützte Zeichen und "kodiert es"
Fand man eine Möglichkeit, um zu bekommen, die ich bei anderen gesehen habe. Da diese Frage NICHT fragt, der beste Weg, aber, ob oder nicht es ist Sie, ich kann Ihnen versichern, dass es NICHT SIE. Sie Tat nichts, eindeutig falsch. Dies ist das Natürliche Verhalten von Javascript.
Wenn wir diskutieren, am besten angesprochen, ich benutze lieber
@Url.Action
nur meine URL und übergeben Sie Parameter als params meiner JQuery-Methode (das .Ajax-Methode ist mein Favorit).Beispiel entlehnt aus e.camper
var url = '@Url.Action("Action", "Controler")';
und dann$.post(url, { a: "a", b: "b"}).success(...)
??ja, das ist ein gutes Beispiel
Ich hasse es, Sie zu widerlegen, die NICHT DU etwas, aber es ist eigentlich @ecampver - Sie generieren Werte für JS-strings, das sollte richtig gemacht werden:
var url = '@HttpUtility.JavaScriptStringEncode(Url.Action("Action", "Controler", new { a = "a", b = "b" }))';
. Auch ist es falsch, dass Javascript erkennt die & - es ist die Razor-engine, die Ausgaben ErgebnisUrl.Action
, einen string, der im Gegensatz zuMvcHtmlString
, so ist es codiert, an der Stelle der Erzeugung der HTML-Antwort. Um dies zu verhindern verwendet manHtml.Raw
, aber da wir erzeugen ein JS-string, verwenden wirJavaScriptStringEncode
.Vielen Dank für die Mühe, das zu kommentieren dieser alten post, es ist immer gut, zu lernen, bessere Wege, Liebe Grüße 🙂
InformationsquelleAutor Dave Alperovich
Das Problem hier ist, dass wenn man mit razor syntax:
@...
die razor engine ist die Codierung der Ergebnis-Url.Aktion (welche ein string ist) als MvcHtmlString. Dies führt in kaufmännische und-Zeichen codiert als&
. Um dies zu umgehen, verwenden SieHtml.Raw
(Zurück-markup, das nicht HTML-codiert.)var url = '@Html.Raw(Url.Action("Action", "Controller", new { a = "a", b = "b" }))';
Ergibt: '/Controller/Action?a=a&b=b'
Dank @GSerg (Siehe Kommentar in Dave Alperovich Antwort)... aber das gewünschte Ergebnis ist nicht javascript-Codierung. Mit
HttpUtility.JavaScriptStringEncode("&")
Ergebnisse in '\u0026'InformationsquelleAutor ngless
alles, was sagte in der obigen Antwort ist toll, ich möchte etwas hinzufügen, um die Art und Weise, die Sie senden die ajax-Anfrage, wenn Sie möchten, senden weiterer Daten, es zu senden, wie
ah, wenn ich gesehen hatte, wie es zuvor wohl nie beantwortet...
InformationsquelleAutor dakait
Wie ich bereits in meinem Kommentar, dies ist ein JavaScript-Codierung Problem. Der beste Weg, um zu verhindern, dass zu tun, alle UrlDecoding oder ersetzen von Zeichen ist eine route definieren, dass die Parameter übereinstimmen, die Sie versuchen zu übergeben
Legen Sie diese in Ihren globalen.asax-Datei über Ihre default-route. Nun, wenn Sie rufen
var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })';
Wird die Ausgabe
/Controller/Action/a/b
Immer, wenn Sie rufen einen Url-helper, MVC wird ausgeführt, dass durch die routing-Tabelle und versuchen Sie zu entsprechen. In deinem Beispiel scheint es, dass Sie übergeben Ihre Parameter sind Teil der URL und nicht in einem tatsächlichen form POSTEN (was in Ordnung ist und nichts falsch mit, dass, wenn Sie auf der Durchreise sind einfache Elemente zurück an den controller).
+1 @Tommy vielen Dank, wusste das nicht, ich werde es im Kopf behalten 😉
Nie für mich gearbeitet
InformationsquelleAutor Tommy
Ich weiß, das ist eine alte Frage, aber ich hatte ein ähnliches Problem, also ich beenden, dies zu tun:
Ich hoffe, dies kann nützlich sein, für jemand anderes.
InformationsquelleAutor Moy