ASP.NET MVC вызывает веб-сервис через AjaxOptions.Url - PullRequest
0 голосов
/ 08 марта 2012

Скажем, я хотел вызвать следующий URL, который возвращает Json через Ajax-вызов:

http://open.mapquestapi.com/nominatim/v1/search?format=json&json_callback=renderBasicSearchNarrative&q=westminster+abbey"

Как это происходит?

Я пытался использовать AjaxOptions.Url следующим образом:

<span id="status">No Status</span>
<div>
     @Ajax.ActionLink("Test", null, null, 
              new AjaxOptions 
              {
                  UpdateTargetId = "status",
                  Url = "http://open.mapquestapi.com/nominatim/v1/search?format=json&json_callback=renderBasicSearchNarrative&q=westminster+abbey"
              })
</div>

но URL не вызывается, когда я нажимаю на ссылку "Тест".

Я тоже пробовал:

    <div>
          <button value="get closest POI" onclick="testNominatim()"></button>
    </div>

    <script type="text/javascript">
     function testNominatim() {
            alert("called");
            $.ajax(
                {
type: "GET",
                url: "http://open.mapquestapi.com/nominatim/v1/search?format=json&json_callback=onGetNominator&q=westminster+abbey",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                failure: function (msg) {
                    alert(msg);
                },
                success: function (msg) {
                    alert(msg);
                }                });

 function onGetNominator(msg) {
        alert(msg);
    }
    </script>

Когда я нажимаю на кнопку, появляется окно сообщения, но веб-служба не вызывается.

Я, наверное, упускаю что-то тривиальное, но что это?

ТИА.

Редактировать 1 Изменения отражают фактический сценарий.

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Использование второй формы будет моим предложенным решением.Обратите внимание, что службе требуется параметр с именем json_callback вместо стандартного параметра callback для функции обратного вызова.Это требует дополнительных настроек в вызове AJAX.

Попробуйте следующее.Обратите внимание, что я изменил обработчик, чтобы применять его, используя код, а не в разметкеЭто лучшая практика.Я также использую jQuery 1.7+.JSFiddle можно найти по адресу: http://jsfiddle.net/xVBBN/

<div>
    <button>get closest POI</button>
</div>

<script type="text/javascript">
$(function() {
    $('button').on('click',function() {
        alert('called');
        $.ajax({
            type: 'GET',
            url: 'http://open.mapquestapi.com/nominatim/v1/search?format=json&q=windsor+[castle]&addressdetails=1&limit=3&viewbox=-1.99%2C52.02%2C0.78%2C50.94&exclude_place_ids=41697',
            dataType: 'jsonp',
            jsonp: 'json_callback',
            success: function(data) {
                alert(data[0].place_id);
            }
        });
    });
});
</script>
1 голос
/ 08 марта 2012

Попробуйте следующее:

<div>
    <button onclick="testNominatim()">get closest POI</button>
</div>

<script type="text/javascript">
    function testNominatim() {
        $.ajax({
            type: "GET",
            url: "http://open.mapquestapi.com/nominatim/v1/search?format=json&json_callback=onGetNominator&q=westminster+abbey",
            dataType: "jsonp"
        });
    }

    function onGetNominator(msg) {
        alert(msg[0].place_id);
    }
</script>

Замечания (по сравнению с исходным кодом):

  • dataType: "jsonp"
  • вам не нужен успешный обратный вызов, потому что успешный обратный вызов - это ваша onGetNominator функция
  • вам не нужно contentType: 'applicatin/json', потому что вы не отправляете запрос JSON

или если вы хотите использовать анонимный успешный обратный вызов:

<div>
    <button onclick="testNominatim()">get closest POI</button>
</div>

<script type="text/javascript">
    function testNominatim() {
        $.ajax({
            type: "GET",
            url: "http://open.mapquestapi.com/nominatim/v1/search?format=json&json_callback=?&q=westminster+abbey",
            dataType: "jsonp",
            success: function (msg) {
                alert(msg[0].place_id);
            }
        });
    }
</script>

Замечания (по сравнению с исходным кодом):

  • json_callback=? в строке запроса, которая будет заменена jQuery со случайным именем, позволяющим вызвать анонимный успешный обратный вызов
  • вам больше не нужна функция onGetNominator, потому что мы используем анонимный обратный вызов успеха
  • вам не нужно contentType: 'applicatin/json', потому что вы не отправляете запрос JSON

А что касается помощника Ajax.ActionLink, я не думаю, что он поддерживает JSONP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...