2011-11-06 64 views
0

这里是我的控制器:ASP.NET DefaultModelBinder没有约束力JSON对象集合

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); 

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

因此,我的 '模式' 参数如下:

model 
    GroupID 12 
    Tags 
    Tag 
     ID 0 
    Tag 
     ID 0 

这是为什么?我必须为ASP.NET MVC做些什么来正确绑定我的ID值?

(注:?我在做什么,似乎几乎完全一样this那么,为什么不是为我工作)

回答

2

经进一步检查,看来这是不可能的,因为'$ .post'使用的jQuery JSON处理器与ASP.NET MVC中的DefaultModelBinder之间的基本不兼容。

基本上,我可以得到模型绑定,如果我模仿一个帖子在小提琴手如下数据(序列化也行,当然)工作:

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

注意,它使用“点”符号,例如:Items [0] .ID = 2。

jQuery的代码是用“方括号”标记,如下:

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

所以,除非有办法让jQuery的使用点符号代替,我想我得找出一些一种解决方法。

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脚本包括到您的页面中。