2012-04-03 13 views
12

Ich habe die zuvor gepostet jQuery/MVC Fragen und habe keine praktikable Antwort gefunden.Ajax Anruf in MVC Controller- URL Problem

Ich habe den folgenden JavaScript-Code:

$.ajax({ 
type: "POST", 
url: '@Url.Action("Search","Controller")', 
data: "{queryString:'" + searchVal + "'}", 
contentType: "application/json; charset=utf-8", 
dataType: "html", 
success: function (data) { 
alert("here" + data.d.toString()); 
} 
}); 

Wenn Aufruf der URL der Post wie folgt aussieht:

NetworkError: 500 Internal Server Error - <a href="http://localhost/Web/Navigation/@Url.Action(%22Search%22,%22Chat%22)"></a> 

Könnte jemand mir bitte erklären, warum sie es nicht zurückgibt wie folgt aus (die Logik dahinter) und biete mir eine gültige Lösung an. Danke im Voraus!
PS: Weitere Informationen:% 22 ist die URL-Codierung Referenz für < < „>> Charakter

+0

Ist Ihr Javascript in einer externen JS-Datei? Oder in der cshtml Datei? –

+0

Ich glaube, dass Sie @Url haben.Aktion ("Suchen", "Controller") in einfachen Anführungszeichen zwingt JS, sie als Zeichenfolge zu behandeln, anstatt die URL vom Routing-System aufzulösen. – dougajmcdonald

+0

wird von chtml aufgerufen, aber es wird in eine externe Datei geschrieben. –

Antwort

41

Damit dies funktioniert, dass Javascript in einem Razor Ansicht platziert werden müssen, damit die Leitung

@Url.Action("Action","Controller") 

wird von Razor und der reale Wert ersetzt analysiert.

Wenn Sie möchten, können Sie in eine Einstellungs-Objekt in der Ansicht sehen nicht Ihre Javascript in Ihrem view bewegen konnte und dann auf die Schaffung verweisen, dass von Ihrem Javascript-Datei.

z.B.

var MyAppUrlSettings = { 
    MyUsefulUrl : '@Url.Action("Action","Controller")' 
} 

und in Ihrer Js

$.ajax({ 
type: "POST", 
url: MyAppUrlSettings.MyUsefulUrl, 
data: "{queryString:'" + searchVal + "'}", 
contentType: "application/json; charset=utf-8", 
dataType: "html", 
success: function (data) { 
alert("here" + data.d.toString()); 
}); 

Datei oder suchen Sie alternativ auf den Rahmen des built in Ajax Methoden innerhalb der HtmlHelpers hebeln die Ihnen erlauben, das gleiche, ohne „verschmutzen“ Ihre Ansichten mit JS-Code zu erreichen .

+0

Ok. Ich könnte ein Schmerz in der Penner mit dieser Frage sein: Ich habe eine View-Datei, die ich den Code, den Sie zur Verfügung gestellt haben. (). Wie kann ich das in ein externes javascript verweisen:

+0

Siehe meine Bearbeitung oben –

+0

Sie Sir ... sind genial! Danke für Ihre Hilfe ! –

8

Sie haben einen Typfehler in Beispielcode. Sie vergessen curlybracket nach success

$.ajax({ 
type: "POST", 
url: '@Url.Action("Search","Controller")', 
data: "{queryString:'" + searchVal + "'}", 
contentType: "application/json; charset=utf-8", 
dataType: "html", 
success: function (data) { 
    alert("here" + data.d.toString()); 
} 
}) 

;

+1

Ich habe die Currybracket aber es erreicht das nicht. Das Problem ist innerhalb der Url.Action Aufruf –

3

ab Rob's Antwort, ich bin zur Zeit die folgenden syntax.Since mit der Frage viel Aufmerksamkeit erhalten hat, habe ich beschlossen, es mit Ihnen zu teilen:

var requrl = '@Url.Action("Action", "Controller", null, Request.Url.Scheme, null)'; 
    $.ajax({ 
    type: "POST", 
    url: requrl, 
    data: "{queryString:'" + searchVal + "'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "html", 
    success: function (data) { 
    alert("here" + data.d.toString()); 
    } 
    }); 
6

Ein guter Weg, es zu tun, ohne sich die Ansicht beteiligt sein können:

$.ajax({ 
    type: "POST", 
    url: '/Controller/Search', 
    data: { queryString: searchVal }, 
    success: function (data) { 
     alert("here" + data.d.toString()); 
    } 
}); 

Dieser wird versuchen, die URL POST:

"http://domain/Controller/Search (die die korrekte URL für die Aktion, die Sie verwenden möchten)“

+0

Vergessen Sie nicht den Schrägstrich vor 'Controller'. Es wird eine falsche URL erstellt. Byut ja, das ist was ich jetzt benutze. –

+0

Sofern Sie keine serverseitige Logik in der URL benötigen, ist dies sauberer. Außerdem wird MVC jeden mit String versehenen JSON in der Eigenschaft "data" in den Parameter "acton" umwandeln, solange die Form des JSON mit der Form des C# -Objekts übereinstimmt. – Paul

0

von mihai-labo's Antwort beginnen, fahren, warum nicht die requrl Variable insgesamt deklarieren und die URL-Erzeugungs Code direkt vor put‚url‘, wie :

$.ajax({ 
    type: "POST", 
    url: '@Url.Action("Action", "Controller", null, Request.Url.Scheme, null)', 
    data: "{queryString:'" + searchVal + "'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "html", 
    success: function (data) { 
     alert("here" + data.d.toString()); 
    } 
});