2012-02-13 5 views
7

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

У меня есть имя класса 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"} 

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

ответ

18

Вы должны установить тип содержимого запроса на 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, ...).

+1

Тег - как существительное, так и глагол –

+0

Спасибо Дарин, я столкнулся с этой проблемой около 1 часа, когда вы меня спасете. Также спасибо за дополнительную информацию – Yucel

+0

Замечание 2. Успех = 0 в ответе, так что блок не будет eval –