通过JSON将对象数组发布到ASP.Net MVC3

Chr*_*ini 65 arrays post json asp.net-mvc-3

我正在寻找通过JSON将对象数组发布到MVC3的解决方案.

我正在处理的示例代码:http: //weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx

JS:

var data = { ItemList: [ {Str: 'hi', Enabled: true} ], X: 1, Y: 2 };

$.ajax({
    url: '/list/save',
    data: JSON.stringify(data),
    success: success,
    error: error,
    type: 'POST',
    contentType: 'application/json, charset=utf-8',
    dataType: 'json'
});
Run Code Online (Sandbox Code Playgroud)

ListViewModel.cs:

public class ListViewModel
{
    public List<ItemViewModel> ItemList { get; set; }
    public float X { get; set; }
    public float Y { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

ItemViewModel.cs:

public class ItemViewModel
{
    public string Str;   // originally posted with: { get; set; }
    public bool Enabled; // originally posted with: { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

ListController.cs:

public ActionResult Save(ListViewModel list)
{
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

这个POST的结果:

list被设置,ListViewModel
它的X和Y属性被设置
底层ItemList属性被设置
ItemList包含一个项目,因为它应该
该ItemList中的项目是未初始化的.Str为null,Enabled为false.

换句话说,这是我从MVC3的模型绑定中获得的:

list.X == 1
list.Y == 2
list.ItemList != null
list.ItemList.Count == 1
list.ItemList[0] != null
list.ItemList[0].Str == null
Run Code Online (Sandbox Code Playgroud)

看来MVC3 JsonValueProvider不适用于复杂对象.我如何让它工作?我是否需要修改现有的MVC3 JsonValueProvider并修复它?如果是这样,我如何获得它并在MVC3项目中替换它?

我已经追求的相关StackOverflow问题无济于事:

Asp.net Mvc Ajax Json(post Array) 使用MVC2和旧的基于表单的编码 - 该方法失败,对象包含一个对象数组(JQuery无法正确编码).

使用JSON发布一个复杂对象数组,将JQuery发布到ASP.NET MVC控制器 使用一个hack我想避免控制器接收一个普通字符串,然后手动反序列化自己,而不是利用框架.

MVC3 RC2 JSON Post绑定无法正常工作 没有他的内容类型集 - 它是在我的代码中设置的.

如何使用JSON,jQuery向ASP.NET MVC Controller发布复杂对象数组? 这个可怜的家伙不得不写一个JsonFilter来解析一个数组.另一个我宁愿避免的黑客行为.

那么,我该如何实现呢?

sta*_*247 43

除此之外{ get; set; },这些是JSON绑定支持的一些条件:

  1. 这是ASP.NET MVC 3中的新功能(请参阅" JavaScript和AJAX改进 ").
  2. JSON对象的字符串('X','Y','Str'和'Enabled')必须与ViewModel对象的属性匹配.
  3. ViewModel对象的属性必须具有{ get; set; }方法.
  4. 必须在请求中将内容类型指定为"application/json".
  5. 如果它仍然不起作用,请检查JSON字符串以确保它是有效的.

更多在我的岗位.

希望有所帮助!


Chr*_*ini 30

问题是列表中的模型中的属性没有在其公共属性上获取/设置.换句话说,MVC3的自动JSON绑定仅适用于具有get和set的对象属性.

这不会绑定:

public string Str;
Run Code Online (Sandbox Code Playgroud)

这将绑定:

public string Str { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 我想说:for(;;){Console.WriteLine("谢谢你,Chris!"); } (5认同)
  • 克里斯,我喜欢你用另一种方式把一切都放进去.+1;) (4认同)

Dar*_*rov 29

真奇怪.我无法重现您的行为.这是我的设置(ASP.NET MVC 3 RTM):

模型:

public class ItemViewModel
{
    public string Str { get; set; }
    public bool Enabled { get; set; }
}

public class ListViewModel
{
    public List<ItemViewModel> ItemList { get; set; }
    public float X { get; set; }
    public float Y { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Save(ListViewModel list)
    {
        return Json(list);
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

@{
    ViewBag.Title = "Home Page";
}

<script type="text/javascript">
    $(function () {
        var data = { ItemList: [{ Str: 'hi', Enabled: true}], X: 1, Y: 2 };

        $.ajax({
            url: '@Url.Action("save", "home")',
            data: JSON.stringify(data),
            type: 'POST',
            contentType: 'application/json',
            dataType: 'json',
            success: function (result) {
                alert(result.ItemList[0].Str);
            }
        });
    });
</script>
Run Code Online (Sandbox Code Playgroud)

运行此警报"hi"并在Save操作内部正确初始化所有内容.

只是为了记录不起作用的是字典.我已经开了一张关于这个问题的票.

  • 每个人:注意这一行>>> contentType:'application/json' (5认同)