Не работает привязка модели Asp.Net MVC 3 JSON - PullRequest
7 голосов
/ 13 февраля 2012

Я использую MVC3 и знаю, что MVC3 поддерживает привязку литерала JSON к параметру Action. Но я не могу сделать это успешно;

У меня есть имя класса Tag

public class Tag
{
    public int tagId { get; set; }
    public string tagName { get; set; }
}

Действие на контроллере под названием Tag

    [HttpPost]
    public ActionResult Tag(Tag tag)
    {
        // Here will be codes...
        return Json(new { success = 0 });
    }

Javascript-код, который отправляет объект js как JSON для моего действия

    var tag ={tagId:5,tagName:"hello"};
    $.ajax({
           url: "/image/tag",
           type: "POST",
           data: $.toJSON(tag),
           success: function (r) {
               if (r.success == 1) {
                   window.location = r.redirect;
               }
           }

Опубликовать данные, которые я вижу на вкладке Firebug Net

{"tagId":5,"tagName":"hello"}

Тег имени параметра в Tag Action не имеет значение null, но имеет значения O для tagId и null для tagName. В чем здесь проблема?

1 Ответ

18 голосов
/ 13 февраля 2012

Вам необходимо установить тип содержимого запроса на application/json:

$.ajax({
    url: '/image/tag',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: $.toJSON(tag),
    success: function (r) {
        if (r.success == 1) {
            window.location.href = r.redirect;
        }
    }
});

А, и вам не нужно, чтобы свойства модели тега начинались со строчной буквы:

public class Tag
{
    public int TagId { get; set; }
    public string TagName { get; set; }
}

Примечание 1. Класс JavaScriptSerializer, который ASP.NET MVC 3 использует за кулисами, способен правильно обрабатывать это.

Примечание 2: В вашем действии Tag вы, похоже, являетесьвозвращая следующий JSON: {"success":0}, тогда как при успешном обратном вызове AJAX вы, похоже, используете какое-то свойство r.redirect, которого не существует.

Примечание 3: Избегайте именования действий вашего контроллера так же, как ваше представлениемоделей.Обычно имена действий должны представлять глаголы (например, List, Save, Delete, ...), тогда как модели представления представляют ресурсы (TagModel, ...).

...