首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过JSON将对象数组发布到ASP.Net MVC3

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

Stack Overflow用户
提问于 2011-01-25 10:39:30
回答 4查看 71.7K关注 0票数 65

我正在寻找一种通过JSON将对象数组POSTing到MVC3的解决方案。

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

JS:

代码语言:javascript
复制
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'
});

ListViewModel.cs:

代码语言:javascript
复制
public class ListViewModel
{
    public List<ItemViewModel> ItemList { get; set; }
    public float X { get; set; }
    public float Y { get; set; }
}

ItemViewModel.cs:

代码语言:javascript
复制
public class ItemViewModel
{
    public string Str;   // originally posted with: { get; set; }
    public bool Enabled; // originally posted with: { get; set; }
}

ListController.cs:

代码语言:javascript
复制
public ActionResult Save(ListViewModel list)
{
    // Do something
}

这篇文章的结果是:

列表已设置为ListViewModel

设置其X和Y属性

设置基础ItemList属性

ItemList包含一项,这是理所应当的

该ItemList中的项未初始化。Str为空,Enabled为false。

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

代码语言:javascript
复制
list.X == 1
list.Y == 2
list.ItemList != null
list.ItemList.Count == 1
list.ItemList[0] != null
list.ItemList[0].Str == null

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

我已经提出的相关StackOverflow问题都无济于事:

Asp.net Mvc Ajax Json (post Array)使用MVC2和更老的基于表单的编码-这种方法对于包含对象数组的对象失败(JQuery无法对其进行正确编码)。

Post an array of complex objects with JSON, JQuery to ASP.NET MVC Controller使用了一种我想避免的方法,即控制器接收一个普通字符串,然后手动反序列化自己,而不是利用框架。

MVC3 RC2 JSON Post Binding not working correctly 没有设置他的内容类型-它是在我的代码中设置的。

这个可怜的家伙不得不写一个JsonFilter来解析一个数组。另一个我更希望避免的黑客攻击。

那么,我如何实现这一点呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-03 07:53:38

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

这将不会绑定:

代码语言:javascript
复制
public string Str;

这将绑定:

代码语言:javascript
复制
public string Str { get; set; }
票数 30
EN

Stack Overflow用户

发布于 2011-01-25 16:26:09

这很奇怪。我无法重现你的行为。这是我的设置(ASP.NET MVC3RTM):

型号:

代码语言:javascript
复制
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; }
}

控制器:

代码语言:javascript
复制
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Save(ListViewModel list)
    {
        return Json(list);
    }
}

查看:

代码语言:javascript
复制
@{
    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>

运行此警报,"hi"Save操作内部的所有内容都已正确初始化。

根据记录,不起作用的是字典。关于这个问题,我已经opened a ticket了。

票数 29
EN

Stack Overflow用户

发布于 2011-09-18 20:02:40

我也遇到过类似的问题,我发现对于一个复杂的对象,会遗漏数值。它们以零的形式出现。即

代码语言:javascript
复制
    var person = {
        Name: "john",
        Age: 9
    }

被MVC控制器作为Person对象接收,其中属性被填充为Name=JohnAge=0

然后我将Javascript中的Age值设置为string...即

代码语言:javascript
复制
    var person = {
        Name: "john",
        Age: "9"
    }

这一切都很顺利。

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

https://stackoverflow.com/questions/4789481

复制
相关文章

相似问题

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