So greifen Sie auf die Javascript-Variable in @ URL.Action () zu

77

Wie kann ich auf den JavaScript-Wert zugreifen @URL.Action()? etwas wie:

<script type="text/javascript">
function name(myjavascriptID)
{
     jQuery("#list_d").jqGrid('setGridParam', { url: '@URL.Action("download file", "download", new { id = <myjavascriptID> })', page: 1 });

}
</script>
Bolu
quelle

Antworten:

139

Das kannst du nicht. JavaScript wird beim Generieren der Aktions-URL nicht ausgeführt. Was Sie tun können, ist so etwas zu tun:

function name(myjavascriptID)    {
     var link = '@Url.Action("download file", "download", new { id = "-1" })';
     link = link.replace("-1", myjavascriptID);

     jQuery("#list_d").jqGrid('setGridParam', { url: link, page: 1 });
}
Brian Mains
quelle
Vielen Dank für Ihre Antwort, es funktioniert mit einer kleinen Modifikation: anstatt link.hrefich muss verwenden link. Vielen Dank!
Bolu
Was ist, wenn die ID eine Zeichenfolge wie "Hallo Welt" ist?
Nic
Die Idee ist, dass -1 etwas ist, das in der Zeichenfolge eindeutig identifizierbar ist, und dass Sie es durch das ersetzen können, was Sie möchten. Sie müssen sicherstellen, dass Hello World wie Hello + World codiert ist. Aber ja, ersetzen Sie es durch was auch immer Sie wollen
Brian Mains
2
Gibt es keine sauberere Lösung?
JuFo
1
Entfernen Sie die vorangestellte @URL.Action@Url.Action
Haupt-
16

Ich mache etwas ziemlich Ähnliches, aber weniger ausführlich:

var myUrl = '@Url.Action("Solution","Partner")/' + myjavascriptID;
$.ajax.load(myUrl); // or whatever

Wir können dies aufgrund des Routings tun, und letztendlich wird Url.Action mit Routenwörterbuchparametern in einen URI übersetzt, der wie folgt aussieht:

http://localhost:41215/Partner/Solution?myJavascriptID=7

Nur eine zweite Wahl, denn wie ein weiser alter Mann einmal sagte: "Es sind unsere Entscheidungen, Harry, die zeigen, was wir wirklich sind, weit mehr als unsere Fähigkeiten."

Shawn J. Molloy
quelle
Es wird RoutAttribute Konfiguration brechen: (((
Kate
11

Sie können die Variablen wie unten gezeigt an einen beliebigen Link übergeben ...

var url = '@Html.Raw(@Url.Action("MethodName", "ControllerName"))' + '?id = ' + myjavascriptID
Spiele
quelle
1

Ähnlich wie bei Brian Mains Antwort könnten Sie Ihre URL-Zeichenfolge formatieren, anstatt -1 durch Ihre Variable zu ersetzen. Wenn Sie also wie ich der Meinung sind, dass es besser ist, sie zu lesen. Bei der folgenden Antwort wird davon ausgegangen, dass Sie den Stringin dieser Antwort vorgeschlagenen Prototyp geändert haben :

var url = unescape('@Url.Action("download file", "download", new { id = "{0}" })').format(myjavascriptID);

Der unescapeAnruf ist notwendig, wenn Sie Ihre entschlüsseln möchten {0}. Ich mag diese Alternative, weil es einfacher ist, mehrere Parameter aus JS-Variablen zu haben. Zum Beispiel:

var url = unescape('@Html.Raw(Url.Action("Action", "Controller", new { id = "{0}", name = "{1}" }))').format(myID, myName);

Ich habe Html.Rawin meinem zweiten Beispiel hinzugefügt, um zu vermeiden, dass &ampdie URL-Zeichenfolge verwendet wird.

Actaram
quelle
Fügen Sie Ihre Antwort mit dieser hinzu und erhalten Sie die perfekte Antwort: stackoverflow.com/a/36981170/453142
David Létourneau
0

Sie können den JavaScript-Code in C # folgendermaßen erstellen:

function fun(jsId) {
  var aTag = '<a href="@Html.Raw(@Url.Action("ActionName", "ControllerName", new { objectId = "xxx01xxx" }).Replace("xxx01xxx", "' + jsId + '"))">LINK</a>';
}

Hier ist der Code aus der Frage, die mit dieser Technik umgeschrieben wurde:

function name(myjavascriptID) {
  jQuery("#list_d").jqGrid('setGridParam', { url: '@Html.Raw(@URL.Action("download file", "download", new { id = "XXXmyjavascriptIDXXX" }).Replace("XXXmyjavascriptIDXXX", "' + myjavascriptID + '"))', page: 1 });
}
xMaa
quelle
0

Sie können den folgenden URL-ähnlichen Code ersetzen

var jsUrl = '@Url.Action("action", "controller")'; // ## is the token
var getUrl = jsUrl.replace('action', action).replace('controller', controller)  
$("#RenderPartial").load(getUrl); 
Joh
quelle