it-roy-ru.com

Вызов Ajax в контроллер MVC - проблема с URL

Я просмотрел ранее опубликованные вопросы по 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="http://localhost/Web/Navigation/@Url.Action(%22Search%22,%22Chat%22)"></a> 

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

18
Mihai Labo

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

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

анализируется Razor и заменяется реальная стоимость.

Если вы не хотите перемещать свой 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());
});

или, альтернативно, посмотрите на использование методов встроенных in Ajax в рамках HtmlHelpers, которые позволяют вам достичь того же самого, не "загрязняя" ваши представления с помощью кода JS.

54
Rob Stevenson-Leggett

у вас есть ошибка типа в примере кода. Вы забыли фигурную скобку после 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());
 }
})

;

9
Yorgo

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

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

Это попытается POST перейти к URL:

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

6
Sicypher

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

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

Простой способ получить доступ к URL Попробуйте этот код

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

начиная с ответа mihai-labo , почему бы не пропустить объявление переменной 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());
    }
});
0
Mpilo Z