Ошибка выполнения вызова Ajax из приложения ASP.NET MVC2 - PullRequest
4 голосов
/ 21 марта 2011

Я конвертирую существующее приложение ASP.NET в MVC2, и у меня есть существующий метод, который вызывается через jQuery с использованием Ajax, который работал раньше, но не работает сейчас.Так что, похоже, есть некоторые изменения, которые мне нужно сделать из-за использования MVC2, которые я не могу понять.

Я уменьшил сложность кода, но он все еще не работает.Это мой текущий код:

jQuery скрипт, который срабатывает при нажатии кнопки

function leaveComment() {
if (validate()) {
    $.ajax({
        type: "POST",
        url: "/Pages/PostBlogComment",
        data: "{'name':'Test','url':'Test','email':'Test','body':'Test','postid':'Test'}",
        dataType: "json",
        success: function (msg) {
            //success code goes here
        },
        error: function (msg) {
           //error code goes here
        }
    });
}

};

Внутри моего контроллера под названием Pages, Я создал следующий метод:

public string PostBlogComment( string name, string url, string email, string body, string postid)
{
  return "This is a test";
}

При отладке я вижу, что вызывается метод PostBlogComment, но здесь я сталкиваюсь с двумя основными проблемами:

  1. Все аргументы метода получены как нулевые, поэтому у меня нет полезных данных для работы.Для тестирования сейчас все аргументы отправляются как Test, как вы можете видеть из кода.
  2. При возврате результата в метод Ajax вызывается путь ошибки, а не путь успеха, даже еслиметод вернул строку как обычно (даже если отправленные параметры были пустыми)

Ошибка, вероятно, легко заметна для тех, кто регулярно работает с этими вещами (или, по крайней мере, я на это надеюсь :))

1 Ответ

10 голосов
/ 21 марта 2011

Вот изменения, необходимые для этой работы:

$.ajax({
    type: 'POST',
    url: '/Pages/PostBlogComment',
    data: { 
        name: 'Test', 
        url: 'Test', 
        email: 'Test', 
        body: 'Test', 
        postid: 'Test'
    },
    success: function (result) {
        alert(result.Value);
    },
    error: function (msg) {
       //error code goes here
    }
});

и действие вашего контроллера

public ActionResult PostBlogComment( 
    string name, 
    string url, 
    string email, 
    string body, 
    string postid
)
{
    return Json(new { Value = "This is a test" });
}

Что можно улучшить, введя модель представления:

public class PostViewModel
{
    public string Name { get; set; }
    public string Url { get; set; }
    public string Email { get; set; }
    public string Body { get; set; }
    public string Postid { get; set; }
}

, а затем:

public ActionResult PostBlogComment(PostViewModel model)
{
    return Json(new { Value = "This is a test" });
}

Что следует отметить:

  1. свойство хэша data хеша AJAX-вызова jquery должно быть моим примером, или вы отправляете строку в кодировке JSON, а механизм связывания модели по умолчанию ASP.NET MVC не знает, как анализировать обратно в качестве аргументов действий. В ASP.NET MVC 3 это изменилось, поскольку существует JsonValueProviderFactory , позволяющая отправлять запросы JSON. Поэтому, если вы используете ASP.NET MVC 3, вы можете отправить свой AJAX-запрос следующим образом, и параметры действия будут правильно привязаны:

    $.ajax({
        type: 'POST',
        url: '/Pages/PostBlogComment',
        data: JSON.stringify({ 
            name: 'Test', 
            url: 'Test', 
            email: 'Test', 
            body: 'Test', 
            postid: 'Test'
        }),
        contentType: 'application/json',
        success: function (result) {
            alert(result.Value);
        },
        error: function (msg) {
           //error code goes here
        }
    });
    
  2. Все действия контроллера в ASP.NET MVC должны возвращать ActionResults. Поэтому, если вы хотите Json, верните JsonResult .

  3. Действие передает анонимный тип методу Json , содержащему свойство Value, которое используется в обратном вызове success, и ответ от сервера будет выглядеть следующим образом:

    { 'Value': 'This is a test' }
    
  4. Никогда не задавайте подобные жесткие URL-адреса в файлах javascript, иначе ваше приложение может сломаться при его развертывании. Всегда используйте помощников URL при работе с URL:

    ...
    url: '<%= Url.Action("PostBlogComment", "Pages") %>',
    ...
    

    или, если это был внешний файл javascript, вы можете использовать глобальную переменную js, которая была инициализирована в вашем представлении, указывающей на правильный URL, или сделать этот URL частью вашего DOM (например, как свойство привязки href или HTML5 * 1043). * атрибуты), а затем используйте jQuery для извлечения значения.

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