2012-04-03 3 views
12

Я рассмотрел ранее опубликованные вопросы jQuery/MVC и не нашел работоспособного ответа.Ajax вызов в MVC Controller-Url Issue

У меня есть следующий код 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()); 
} 
}); 

При вызове URL-сообщение выглядит следующим образом:

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

Может кто-то пожалуйста, объясните мне, почему это вернуть его, как это (логика за ним) и предложить мне действительное решение. Заранее спасибо!
PS: Дополнительная информация:% 22 является Кодировка URL Ссылка для < < «>> символьного

+0

Является ли ваш Javascript во внешнем JS-файле? Или в файле cshtml? –

+0

Я считаю, что у вас есть @Url.Действие («Поиск», «Контроллер») внутри одинарных кавычек заставляет JS рассматривать его как строку, а не разрешать URL-адрес из системы маршрутизации. – dougajmcdonald

+0

его вызвал из chtml, но он написан во внешнем файле. –

ответ

41

Для того, чтобы это работало, что Javascript должен быть помещен в представлении Razor так, что линии

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

разбирается бритвы и реальная стоимость замены.

Если вы не хотите, чтобы переместить Javascript в вашем View вы можете взглянуть на создание объекта установок в окне, а затем ссылки, что из файла Javascript.

, например.

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

и в вашем .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()); 
}); 

или альтернативно посмотреть на выравнивающем built в Ajax методах указанной выше рамок, в пределах HtmlHelpers, которые позволяют достичь того же, не «загрязнять» свои представления с JS кодом ,

+0

Хорошо. Мне может быть боль в заднице с этим вопросом: у меня есть файл вида, в который я включил код, который вы предоставили. (). Как я могу ссылаться на внешний javascript:

+0

См. Мои изменения выше –

+0

Вы, сэр ... потрясающие! Спасибо за вашу помощь ! –

8

У вас есть ошибка типа в примере кода. Вы забудете кудрявую скобу после 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

У меня есть currybracket, но он этого не достигает. Проблема заключается в вызове Url.Action –

3

Начиная с Rob's ответа, я в настоящее время, используя следующий syntax.Since вопрос получил много внимания, я решил поделиться с вами:

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

Хороший способ сделать это, не получая вид могут быть вовлечены:

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

Это будет пытаться POST к URL-адресу:

"http://domain/Controller/Search (который является правильным URL для действия, которое вы хотите использовать)»

+0

Не забывайте косую черту перед «Контроллером». Он создаст неверный URL-адрес. byut да, это то, что я использую сейчас. –

+0

Если вам не нужна логика сервера на URL-адресе, это чище. Кроме того, MVC передаст любой сжатый json в свойстве data в параметр acton, если форма json соответствует форме объекта C#. – Paul

0

начиная с mihai-labo's ответа, почему бы не пропустить объявление переменной requrl в целом и поставить генерирующий URL-код непосредственно перед„URL:“, как :

$.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()); 
    } 
}); 
Смежные вопросы