ASP.NET DefaultModelBinder不绑定JSON集合对象

时间:2011-11-06 07:18:06

标签: jquery json asp.net-mvc-3 model-binding

这是我的控制器:

public class TagsController : Controller
{
  public ActionResult Attach(TagsAttach model)
  {
    // ...
  }
}

以下是我的观点模型:

public class TagsAttach
{
  public int GroupID { get; set; }
  public List<Tag> Tags { get; set; }
}

public class Tag
{
  public int ID { get; set; }
}

这是我用来尝试提交数据的Javascript代码:

var data = {
  GroupID: 12,
  Tags: []
};

data.Tags.push({ ID: 3 });
data.Tags.push({ ID: 4 });

$.push('/Tags/Attach', data);

但是,当我调试控制器动作时,除了每个Tag对象中的ID值外,我发现一切都在那里。

因此,我的'model'参数如下所示:

model
  GroupID  12
  Tags
    Tag
      ID   0
    Tag
      ID   0

这是为什么?我需要做什么才能使ASP.NET MVC正确绑定我的ID值?

(注意:我正在做的事情与this几乎完全相同。那为什么它对我不起作用?)

2 个答案:

答案 0 :(得分:3)

ASP.NET MVC 3有一个内置的JsonValueProviderFactory,它允许您将JSON请求发送到控制器操作,默认模型绑定器将能够将此JSON字符串转换为相应的视图模型。您可以使用$.ajax方法,如下所示:

var dataToSend = { 
    // model is the name of the action parameter
    // this nesting could be omitted
    model: { 
        GroupID: 12, 
        Tags: [ { ID: 3 }, { ID: 4 } ] 
    } 
};

// the following will also work but assumes that you have a single
// action argument. And since your actions should take only the view model
// as action argument it is also a good way: 
// var dataToSend = { GroupID: 12, Tags: [ { ID: 3 }, { ID: 4 } ] };

$.ajax({
    url: '@Url.Action("Attach", "Tags")',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(dataToSend),
    success: function(result) {
        alert('success');
    }
});

这允许您将任意复杂的javascript文字发送到控制器操作。

重要评论:

  • contentType: 'application/json; charset=utf-8'设置Content-Type请求标头,以便服务器知道我们正在发送JSON请求。

  • JSON.stringify是一种将javascript文字序列化为JSON字符串的方法。此方法本身内置于现代浏览器中,但如果您需要支持旧版浏览器,则可以在页面中加入json2.js脚本。

答案 1 :(得分:2)

经过进一步检查,由于'$ .post'使用的jQuery JSON处理器与ASP.NET MVC中的DefaultModelBinder之间基本不兼容,似乎无法实现这一点。

基本上,如果我使用以下数据模拟fiddler中的帖子(当然也可以序列化它),我可以让模型绑定工作:

SearchTagID=1&ApplicationType=0&Items[0].ID=2&Items[1].ID=672

请注意,它使用'dot'表示法,例如:Items [0] .ID = 2。

jQuery代码使用'square-bracket'表示法,如下所示:

SearchTagID=1&ApplicationType=0&Items[0][ID]=2&Items[1][ID]=672

因此,除非有办法让jQuery使用点符号,否则我想我必须弄清楚某种解决方法。