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>

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 });
}

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."


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

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.


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 });
}

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); 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.