2012-04-03 16 views
12

Sprawdziłem wcześniej opublikowane pytania jQuery/MVC i nie znalazłem praktycznej odpowiedzi.Wywołanie Ajax Into MVC Controller - Url Issue

Mam następujący kod JavaScript:

$.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()); 
} 
}); 

Dzwoniąc Url post wygląda następująco:

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

Czy ktoś mógłby mi wyjaśnić, dlaczego to powrót to tak (logikę za nim) i zaoferować mi prawidłowe rozwiązanie. Z góry dziękuję!
PS: Dodatkowe informacje: 22% jest Przekierowanie Kodowanie < < „>> znaków

+0

Czy Twój JavaScript znajduje się w zewnętrznym pliku JS? Lub w pliku cshtml? –

+0

Wierzę, że masz @Url.Akcja ("Szukaj", "Kontroler") wewnątrz pojedynczych cudzysłowów zmusza JS do traktowania go jako ciągu znaków, a nie do rozstrzygania adresu URL z systemu trasowania. – dougajmcdonald

+0

jest wywoływana z chtml, ale jest zapisana w zewnętrznym pliku. –

Odpowiedz

41

Aby to do pracy czy Javascript musi być umieszczony w widoku Razor tak, że linia

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

jest analizowany przez Razor i rzeczywista wartość wymiany.

Jeśli nie chcesz, aby przenieść Javascript w swojej View można patrzeć na stworzenie ustawienia obiektu w widoku, a następnie odwołanie, że z pliku JavaScript.

np.

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

iw swoim js plik

$.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()); 
}); 

lub alternatywnie spojrzeć na podważając built w Ajax metod ramową w obrębie HtmlHelpers które pozwalają osiągnąć to samo bez „zanieczyścić” swoje poglądy z kodem JS .

+0

Ok. Mogę być bolesny w tym pytaniu: Mam plik poglądowy, w którym zawarłem dostarczony przez ciebie kod. (). Jak mogę odwołać się do zewnętrznego javascript:

+0

Zobacz moją zmianę powyżej –

+0

Jesteś panem ... są niesamowite! Dzięki za pomoc ! –

8

masz błąd typu w przykładzie kodu. Zapominasz curlybracket po 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

Mam curry, ale to nie osiąga. Problem jest w obrębie Url.Action call –

3

Począwszy od Rob's odpowiedź, Używam obecnie następujące syntax.Since pytanie otrzymał wiele uwagi, postanowiłem podzielić się z wami:

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

Dobrym sposobem, aby to zrobić bez uzyskania widok zaangażowane mogą być:

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

ten postara się pocztą na adres URL:

"http://domain/Controller/Search (który jest prawidłowy adres URL do akcji, której chcesz użyć)”

+0

Nie zapomnij ukośnika przed "Controller". Tworzy niepoprawny adres URL. tak, tak, teraz tego używam. –

+0

Jeśli nie potrzebujesz logiki po stronie serwera, jest to czystsze. Ponadto, MVC będzie rzutować dowolne spreparowane json we właściwości data na parametr actona, o ile kształt json odpowiada kształtowi obiektu C#. – Paul

0

począwszy od mihai-labo's odpowiedź, dlaczego nie pominąć deklarując zmienną requrl całkowicie i umieścić kod generujący URL bezpośrednio przed«URL», jak :

$.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()); 
    } 
}); 
Powiązane problemy