Вызов Ajax в контроллер MVC - проблема с URL - PullRequest
19 голосов
/ 03 апреля 2012

Я посмотрел на ранее опубликованные вопросы 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> 

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

Ответы [ 6 ]

56 голосов
/ 03 апреля 2012

Для того, чтобы это работало, 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());
});

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

10 голосов
/ 03 апреля 2012

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

;

8 голосов
/ 10 июня 2016

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

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

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

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

3 голосов
/ 07 сентября 2012

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

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());
   }
  });
0 голосов
/ 16 марта 2018

Простой способ доступа к 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 голосов
/ 30 марта 2017

начиная с ответа 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());
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...