Вызов MVC 3 JSON не работает в IIS - PullRequest
5 голосов
/ 18 февраля 2011

Я работаю в приложении MVC 3 с механизмом ASPX, и для начала я разработал простой поиск, который использует вызов JQuery JSON для получения некоторой информации. Вызов отправляет параметр, взятый из текстового ввода, и обновляет таблицу с результатами. Функция выглядит так:

        function PerformLookup() {
            var _accountNumber = $('#accountNumber').val();

            $.ajax({
                url: '/SearchAjax/SearchAccount',
                type: 'POST',
                data: '{_accountNumber:'+_accountNumber+'}',
                dataType: 'json',
                contentType: 'application/json; charset=utf-8',
                success: function (data) {
                    UpdateTable(data);
                },
                error: function () {
                    alert('An error occurred while performing the search.');
                }
            });

            return false;
        }

Серверный код выполняет запрос с этим параметром и возвращает список, сериализованный в JSON, для нормальной работы с JQuery. Код сервера выглядит так:

        [HttpPost]
        public JsonResult SearchAccount(string _accountNumber)
        {
            MLIBEntities dbMLIB = new MLIBEntities();

            var searchResults = (from s in dbMLIB.Sets
                                 where s.setmap1 == _accountNumber
                                 select s);
            return Json(searchResults.ToList());
        }

Как видите, ничего сложного, и он отлично работает, когда я запускаю проект из VS2010 и использую его виртуальную машину.

Проблема возникает, когда я публикую проект на сервере Windows 2008 с IIS 7. Проект выполняется нормально, но когда я запускаю функцию PerformLookup, я получаю сообщение «Произошла ошибка при выполнении поиска», означающее, что произошел сбой вызова ajax .

Кто-нибудь знает, почему происходит сбой вызова в IIS при идеальной работе в виртуальной машине VS2010? Не хватает ли мне какой-либо конфигурации IIS?

Заранее спасибо!

Ответы [ 2 ]

10 голосов
/ 18 февраля 2011

Никогда не используйте такие жесткие URL-адреса, потому что при развертывании приложения к вашим URL-адресам может быть добавлен виртуальный каталог:

url: '/SearchAjax/SearchAccount',

Всегда используйте помощники Url при работе с URL-адресами:

url: '<%= Url.Action("SearchAccount", "SearchAjax") %>',

Итак, вот как я бы провел рефакторинг вашего кода:

function PerformLookup() {
    var _accountNumber = $('#accountNumber').val();
    $.ajax({
        url: '<%= Url.Action("SearchAccount", "SearchAjax") %>',
        type: 'POST',
        data: JSON.stringify({ _accountNumber: _accountNumber }),
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            UpdateTable(data);
        },
        error: function () {
            alert('An error occurred while performing the search.');
        }
    });
    return false;
}

или если эта функция PerformLookup вызывается при нажатии какой-либо ссылки, я бы создал ссылку с помощью помощника HTML:

<%= Html.ActionLink(
    "Perform search", 
    "SearchAccount", 
    "SearchAjax", 
    null, 
    new { id = "search" }
) %>

, а затем просто AJAXify:

$(function() {
    $('#search').click(function() {
        var _accountNumber = $('#accountNumber').val();
        $.ajax({
            url: this.href,
            type: 'POST',
            // Probably no need to send JSON request
            // so I've replaced it with a standard
            // application/x-www-form-urlencoded POST request
            data: { _accountNumber: _accountNumber },
            dataType: 'json',
            success: function (data) {
                UpdateTable(data);
            },
            error: function () {
                alert('An error occurred while performing the search.');
            }
        });
        return false;
    });
});

И, наконец, я настоятельно рекомендую вам использовать FireBug , который является отличным инструментом, позволяющим устранять проблемы такого рода, так какпоказывает все запросы AJAX и что происходит между клиентом и сервером.

0 голосов
/ 03 июля 2015

просто поместите полный URL в javascript:

$.ajax({
    type: "POST",
    url: "/Appnamehere/Controller/Action", ...

это прекрасно работает ..

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