首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET DefaultModelBinder没有绑定JSON集合对象

ASP.NET DefaultModelBinder没有绑定JSON集合对象
EN

Stack Overflow用户
提问于 2011-11-06 15:18:06
回答 2查看 1K关注 0票数 0

这是我的控制器:

代码语言:javascript
复制
public class TagsController : Controller
{
  public ActionResult Attach(TagsAttach model)
  {
    // ...
  }
}

以下是我的视图模型:

代码语言:javascript
复制
public class TagsAttach
{
  public int GroupID { get; set; }
  public List<Tag> Tags { get; set; }
}

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

下面是我用来提交数据的Javascript代码:

代码语言:javascript
复制
var data = {
  GroupID: 12,
  Tags: []
};

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

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

但是,当我调试我的控制器操作时,我发现除了每个标记对象中的ID值之外,所有东西都在那里。

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

代码语言:javascript
复制
model
  GroupID  12
  Tags
    Tag
      ID   0
    Tag
      ID   0

为什么会这样呢?要让ASP.NET MVC正确绑定我的ID值,我需要做些什么?

(注意:我正在做的事情看起来和this几乎完全一样。那么为什么它对我不起作用呢?)

EN

回答 2

Stack Overflow用户

发布于 2011-11-06 18:52:16

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

代码语言:javascript
复制
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请求报头,以便服务器知道我们正在发送request.
  • JSON.stringify,它是一个将javascript文字序列化为JSON字符串的方法。此方法本机内置于现代浏览器中,但如果您需要支持传统浏览器,则可以在页面中包含json2.js脚本。
票数 3
EN

Stack Overflow用户

发布于 2011-11-06 15:39:40

经过进一步检查,这似乎是不可能的,因为“$.post”使用的jQuery JSON处理器与ASP.NET MVC中的DefaultModelBinder之间存在基本不兼容。

基本上,如果我用下面的数据在fiddler中模拟一个post (当然,还要序列化它),我就可以让模型绑定工作起来:

代码语言:javascript
复制
SearchTagID=1&ApplicationType=0&Items[0].ID=2&Items[1].ID=672

注意,它使用的是‘点’符号,例如: Items.ID=2。

jQuery代码使用“方括号”表示法,如下所示:

代码语言:javascript
复制
SearchTagID=1&ApplicationType=0&Items[0][ID]=2&Items[1][ID]=672

因此,除非有办法让jQuery改用点符号,否则我想我必须想出一些变通办法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8025734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档