我正在寻找一种通过JSON将对象数组POSTing到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'
});
ListViewModel.cs:
public class ListViewModel
{
public List<ItemViewModel> ItemList { get; set; }
public float X { get; set; }
public float Y { get; set; }
}
ItemViewModel.cs:
public class ItemViewModel
{
public string Str; // originally posted with: { get; set; }
public bool Enabled; // originally posted with: { get; set; }
}
ListController.cs:
public ActionResult Save(ListViewModel list)
{
// Do something
}
这篇文章的结果是:
列表已设置为ListViewModel
设置其X和Y属性
设置基础ItemList属性
ItemList包含一项,这是理所应当的
该ItemList中的项未初始化。Str为空,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
看起来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来解析一个数组。另一个我更希望避免的黑客攻击。
那么,我如何实现这一点呢?
发布于 2011-02-03 07:53:38
问题是列表中的模型中的属性在其公共属性上没有get/set。换句话说,MVC3的自动JSON绑定只适用于具有get和set的对象属性。
这将不会绑定:
public string Str;
这将绑定:
public string Str { get; set; }
发布于 2011-01-25 16:26:09
这很奇怪。我无法重现你的行为。这是我的设置(ASP.NET MVC3RTM):
型号:
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; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Save(ListViewModel list)
{
return Json(list);
}
}
查看:
@{
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了。
发布于 2011-09-18 20:02:40
我也遇到过类似的问题,我发现对于一个复杂的对象,会遗漏数值。它们以零的形式出现。即
var person = {
Name: "john",
Age: 9
}
被MVC控制器作为Person对象接收,其中属性被填充为Name=John
和Age=0
。
然后我将Javascript中的Age值设置为string...即
var person = {
Name: "john",
Age: "9"
}
这一切都很顺利。
https://stackoverflow.com/questions/4789481
复制相似问题