2010-01-06 8 views
18

Ich versuche, auf eine andere Seite umzuleiten, indem ich eine Aktion im Controller mit einem bestimmten Parameter aufruft. Ich versuche diese Zeile zu verwenden:Generierung einer Aktions-URL in JavaScript für ASP.NET MVC

window.open('<%= Url.Action("Report", "Survey", 
    new { id = ' + selectedRow + ' }) %>'); 

Aber ich konnte es nicht arbeiten lassen; Es gibt den folgenden Fehler:

CS1012: Too many characters in character literal.

Kann ich die Aktion URL nicht generieren, die auf der Clientseite war? Oder muss ich einen Ajax-Aufruf durchführen, indem ich den Parameter zur Verfügung stelle und die benötigte URL zurückbekomme? Das scheint nicht richtig zu sein, aber ich möchte es, wenn es der einzige Weg ist.

Gibt es eine einfachere Lösung?

+0

Ist es ein JS-Fehler? Was ist HTML-Ergebnis gerendert? –

Antwort

52

Denken Sie daran, dass alles zwischen <% und%> als C# Code interpretiert wird, so, was Sie tatsächlich versucht, tun die folgende Zeile von C# zu bewerten:

Url.Action("Report", "Survey", new { id = ' + selectedRow + ' }) 

C# denkt die Apostrophe sind Umgeben eines Zeichenkennzeichens, daher die Fehlermeldung, die Sie erhalten (Zeichenliterale können nur ein einzelnes Zeichen in C# enthalten)

Vielleicht könnten Sie die URL einmal in Ihrem Skript Seite - irgendwo auf Ihrer Seite HEAD, dies tun:

var actionUrl = 
    '<%= Url.Action("Report", "Survey", new { id = "PLACEHOLDER" }) %>'; 

Das gibt Ihnen eine Javascript-Zeichenfolge mit der URL, die Sie benötigen, aber mit PLACEHOLDER anstelle der Nummer. Dann richten Sie Ihre Klick-Handler als:

window.open(actionUrl.replace('PLACEHOLDER', selectedRow)); 

das heißt, wenn der Handler ausgeführt wird, finden Sie den Platzhalter ein Wert in der vorausberechneten URL und ersetzen Sie es mit der ausgewählten Zeile.

+0

Danke für die Antwort. Es funktionierte! – canxss

+0

Ich weiß nicht, ob es dir helfen wird, aber diese Frage/Antwort hat mir geholfen. http://stackoverflow.com/questions/5093977/razor-mvc3-jquery-urlaction-partialviews/5094357#5094357 –

3

Können Sie

window.open('/report/survey/' + selectedRow); 

statt, wo ausgewählte Zeile Ich nehme an, die id ist? Das Routing sollte dies gut aufnehmen.

oder verwenden getJSON

Vielleicht könnten Sie JsonResult stattdessen verwenden. Wo auch immer das window.open aufgerufen werden sollte, rufen Sie stattdessen eine Methode auf, d. H. OpenSurveyWindow (id);

dann fügen Sie einige Jquery ähnlich wie unter

function OpenSurveyWindow(id){ 
     $.getJSON("/report/survey/" + id, null, function(data) { 
      window.open(data); 
    }); 
} 

jetzt in Ihrem Controller

public JsonResult Survey(int id) 
{ 
    return Json(GetMyUrlMethod(id)); 
} 

Dieser Code isnt syntaktisch perfekt sauber, aber etwas in diese Richtung arbeiten sollte

+0

Aber ich möchte die URL von der Url.Action generiert werden, weil ich auf diese Weise auch die URL-Root-Parameter angeben kann, die sich ändern können! – canxss

+0

Danke für die Antwort. Es funktioniert, aber um einen einfachen Weg zu bekommen, scheint mir ein Ajax-Anruf nicht in Ordnung zu sein. Aber wenn es keinen anderen Weg gäbe, würde ich es trotzdem tun. – canxss

0

Sie nicht in der Lage sein, Tun Sie dies, die URL.Action ist ein serverseitiger Prozess und wird daher analysiert, bevor die Client-Seite selectedRow verfügbar ist. Israfel hat die Antwort, die ich vorschlagen würde.

0

Wenn selectedRow eine clientseitige Variable ist, wird es nicht funktionieren. Sie müssen die @ Israfel-Implementierung zum Verknüpfen verwenden. Dies liegt daran, dass die Server-Seite ausgeführt wird, bevor die clientseitige Variable überhaupt existiert.

Wenn SelectedRow eine serverseitige Variable innerhalb der Ansicht ist, wechseln Sie in dieses:

window.open (‘<% = Url.Action ("Report", "Survey", neue {id = SelectedRow})%> ');

Dies liegt daran, dass die ID den Variablentyp selectedRow ableitet, oder Sie können mit der Methode ToString() in eine Zeichenfolge konvertieren (solange sie nicht null ist).

9

Normalerweise deklariere ich eine JavaScript-Variable in dem Abschnitt, um den Stamm meiner Website zu halten.

<%="<script type=\"text/javascript\">var rootPath = '" 
    + Url.Content("~/") + "';</script>" %> 

Ihr Problem lösen ich einfach

window.open(rootPath + "report/survey/" + selectedRow); 
+0

Einfach und effektiv. Auf einer Rasierklingenseite brauchte ich \t ' ' – JabberwockyDecompiler

0

Eine Art und Weise tun würde, dies zu tun, die sauberere die T4MVC T4 templates mit umfasst angesehen werden könnten. Sie könnten dann die JavaScript in Ihrem Ansicht wie folgt schreiben:

var reportUrl = '<%= Url.JavaScriptReplacableUrl(MVC.Survey.Report())%>'; 
reportUrl = myUrl.replace('{' + MVC.Survey.ReportParams.id + '}', selectedRow); 

window.open(reportUrl); 

Der Vorteil hierbei ist, dass Sie kompilieren Zeit erhalten für den Controller, Aktion Überprüfung und Aktionsparameter.

0

Eine weitere Sache, die getan werden kann, nicht so sauber Ich denke:

var url = "@Url.RouteUrl(new { area = string.Empty, controller = "Survey", action = "Report" })"; 
var fullUrl = url + '?id=' + selectedRow; 
0

Der einfachste Weg ist ein Javascript-Variable zu deklarieren, als der Parameterwert auf den Link concate.

var url = '@Url.Action("Action","Controller")' + "/" + yourjavascriptvariable; 
    <a href='" + url + "'> 
1

Nur wenn jemand noch danach sucht. Die Controller-Aktion kann normale Parameter oder ein Modellobjekt mit diesen Feldern haben. MVC wird den Valus automatisch binden.

var url = '@Url.Action("Action", "Controller")'; 
$.post(url, { 
     YearId: $("#YearId").val(), 
     LeaveTypeId: $("#LeaveTypeId").val() 
}, function (data) { 
     //Do what u like with result 
});