Что не так, когда я получаю «Внутреннюю ошибку сервера», возвращенную из вызова jquery $ .ajax в проекте ASP.NET MVC? - PullRequest
2 голосов
/ 24 июня 2009

Вот мой вызов ajax:

response = $.ajax({
            type: "POST",
            url: "/Row/getRowName",
            dataType: "json",
            data:({ currRow : rowName, offset : 5 }),
            error:function(request){alert(request.statusText)},
            success:function(result){alert(result)}
        }).responseText;

Я получаю Внутреннюю ошибку сервера как предупреждение. У меня также есть точка останова в моем методе getRowName в моем RowController.

Вот метод getRowName:

    [AcceptVerbs(HttpVerbs.Post)]
    public string getRowName(string currRow, int offset)
    {
        string rowName;

        rowName = _rowRepository.getRowNameByOffset(currRow, offset);

        return rowName;
    }

Что вызывает внутреннюю ошибку сервера? Как я могу это исправить? Правильно ли я использую всю концепцию контроллера или мне следует использовать WebServices для подобных вещей?

Редактировать: Контроллером, который вызывает страницу, является HomeController, а в качестве звонка я использую RowController. RowController находится в той же папке, что и HomeController (не уверен, имеет ли это значение).

Но я узнал, создаю ли я фиктивную функцию:

    [AcceptVerbs(HttpVerbs.Post)]
    public string sayHi()
    {
        return "Hi";
    }

и вызывать его одинаково (другой URL, поскольку он находится в домашнем контроллере):

response = $.ajax({
            type: "POST",
            url: "/Home/sayHi",
            dataType: "json",
            error:function(request){alert(request.statusText)},
            success:function(result){alert(result)}
        }).responseText;

Есть какие-нибудь идеи относительно того, почему это сработает, а с другой нет?

Ответы [ 5 ]

3 голосов
/ 24 июня 2009

Вы используете IE8 или Firefox с FireBug ? Использование консолей скриптов в любом из них даст вам гораздо больше информации о деталях ошибки, которую вы получаете с сервера.

Различия между двумя методами, которые вы публикуете, заключаются в параметрах - второй метод в вашем редакторе не имеет ни одного, в то время как один в первом методе имеет некоторые - я бы поспорил, что вы ошиблись Это связано с тем, что фреймворк неправильно десериализует ваши данные.

Сначала вы пробовали:

data:"{ \"currRow\":\"" + rowName + "\", \"offset\":\"5\" }" 
0 голосов
/ 21 апреля 2019

Вы также можете проверить свои права доступа к файлам. Вы также получите это сообщение, если ваш сервер настроен более строго, чем ваш файл.

0 голосов
/ 04 апреля 2011

Я получил ошибку 500, потому что я не добавил это явно:

type: "POST",

Как только я добавил это, все было хорошо. Я явно не помечал метод Action как GET или POST, поэтому я предполагаю, что по умолчанию это POST - отсюда и ошибка.

0 голосов
/ 24 июня 2009

Я думаю, что вашей проблемой могут быть круглые скобки вокруг данных. Это действительно должен быть просто объект, который используется для аргументов. Если я прав, то внутренняя ошибка сервера в том, что обработчик маршрута не может найти подходящую подпись для getRowName.

Чтобы это работало, вам также нужно вернуть JsonResult из вашего метода, а не строку. Это также может быть проблемой, так как он может искать только методы, которые возвращают ActionResult.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult getRowName(string currRow, int offset)
{
    string rowName;

    rowName = _rowRepository.getRowNameByOffset(currRow, offset);

    return Json( new { RowName = rowName } );
}

Кроме того, вызов Ajax не приведет к созданию объекта. Вам нужно, чтобы ваш обработчик успеха делал то, что вы пытаетесь сделать с ответом.

$.ajax({
        type: "POST",
        url: "/Row/getRowName",
        dataType: "json",
        data: { currRow : rowName, offset : 5 },
        error:function(request){alert(request.statusText)},
        success:function(result){
           $('#rowNameContainer').html( result.RowName );
        }
});

Если вам действительно нужен результат в переменной (маловероятно, но возможно), тогда вы можете выполнить синхронный вызов ajax (async: false) и установить переменную в функции успеха.

$(...).click( function() {
   var response = null;
   $.ajax({
        type: "POST",
        async: false,
        url: "/Row/getRowName",
        dataType: "json",
        data: { currRow : rowName, offset : 5 },
        error:function(request){alert(request.statusText)},
        success:function(result){
           response = result.RowName;
        }
   });

   ... do something with response...
   return false;
});
0 голосов
/ 24 июня 2009

Ваш сервер должен быть устойчивым. Ничто из того, что делает JQuery или любой другой клиент, не должно вызывать ошибку HTTP 500. Что касается сервера, код, который вы дали, ничего не объясняет. Это сводится к:

return _rowRepository.getRowNameByOffset(currRow, offset)

Так что нам, вероятно, понадобится хотя бы источник getRowNameByOffset, чтобы начать его выяснять.

РЕДАКТИРОВАТЬ: Еще одна мысль, которую вы можете попробовать для тестирования, это просто получить getRowName что-то вроде тривиального типа

return "currRow" + " " + offset

чтобы убедиться, что проблема не в другом месте.

...