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