Ajax вызов в контроллер MVC-Url Issue
Я просмотрел ранее заданные вопросы jQuery/MVC и не нашел работоспособного ответа.
У меня есть следующий код 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="#" onclick="location.href='http://localhost/Web/Navigation/@Url.Action(%22Search%22,%22Chat%22)'; return false;"></a>
Не мог бы кто-нибудь объяснить мне, почему он возвращает его так (логика позади) и предлагает мне действительное решение. Спасибо заранее!
P.S.: Дополнительная информация:% 22 - ссылка для кодирования URL для символа < <" →
Ответы
Ответ 1
Чтобы это работало, Javascript должен быть помещен в представление Razor, чтобы строка
@Url.Action("Action","Controller")
анализируется Razor и заменяется реальное значение.
Если вы не хотите переместить свой Javascript в свой вид, вы можете посмотреть на создание объекта настроек в представлении, а затем ссылаться на него из вашего файла 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());
});
или, альтернативно, взгляните на механизм построенный в Ajax, в рамках HtmlHelpers, которые позволяют вам достичь того же, не "загрязняя" ваши представления с помощью JS-кода.
Ответ 2
у вас есть ошибка типа в примере кода. Вы забудете curlybracket после 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());
}
})
;
Ответ 3
Хорошим способом сделать это, не привлекая внимание, может быть:
$.ajax({
type: "POST",
url: '/Controller/Search',
data: { queryString: searchVal },
success: function (data) {
alert("here" + data.d.toString());
}
});
Это попытается установить POST по URL-адресу:
" http://domain/Controller/Search (который является правильным URL для действия, которое вы хотите использовать)
Ответ 4
Начиная с Роба, я использую следующий синтаксис. Поскольку вопрос получил много внимания, я решил поделиться им с вами:
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());
}
});
Ответ 5
начиная с
$.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());
}
});