KnockOutJs对象没有发布

我正在研究一个KnockOutJs示例,并且在MVC3上遇到了一些问题。 我的示例在使用整页回发时正确发布。 当我尝试使用jQuery Ajaxpost进行保存时,我可以看到使用Firebug .NET查看器中的Post是:

{gifts:[{“GiftId”:0,“Title”:“sad”,“Price”:3}]}

当我在MVC3中的ModelBinder中查看ControllerContext时,表单参数为空,json不绑定。 关于发生了什么的任何想法?

我尝试了许多配置,但这里是jQuery发布代码(目前硬编码为静态值):

$.ajax({ url: "/Home/PartialUpdate", type: 'POST', cache: false, data: '{ gifts:[{"GiftId":0,"Title":"sad","Price":3}] }', //ko.toJSON({ gifts: this.gifts }), dataType: 'json' , contentType: "application/json;", success: function(result){ alert(result); var data = ko.utils.parseJson(result); this.gifts = ko.observableArray(data) ; }, error:function(xhr,err){ alert("readyState: " + xhr.readyState+"\nstatus: "+xhr.status); alert("responseText: " + xhr.responseText); } }); 

编辑:这是Ajax更新代码的MVC3操作代码

 [HttpPost] public JsonResult PartialUpdate ([FromJson] IEnumerable gifts) { gifts = gifts ?? new List(); using (var context = new KnockOutContext()) { // Add record if not in DB foreach (var gift in gifts ) { context.Entry(gift).State = (gift.GiftId == 0) ? EntityState.Added : EntityState.Modified; } // Delete records if not in ViewModel foreach (var dbGift in context.Gifts) { if (gifts.SingleOrDefault(c => c.GiftId == dbGift.GiftId) == null) context.Gifts.Remove(dbGift); } context.SaveChanges(); } return GetGifts_Json(); } 

以及完整的回发代码(来自Steve Sanderson的例子,来自http://blog.stevensanderson.com/2010/07/12/editing-a-variable-length-list-knockout-style/ )

 [HttpPost] public ActionResult Index([FromJson] IEnumerable gifts) { SaveGifts(gifts); return RedirectToAction("Index"); } 

使用此自定义模型绑定器:

  public class FromJsonAttribute : CustomModelBinderAttribute { private readonly static JavaScriptSerializer serializer = new JavaScriptSerializer(); public override IModelBinder GetBinder() { return new JsonModelBinder(); } private class JsonModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var stringified = controllerContext.HttpContext.Request[bindingContext.ModelName]; if (string.IsNullOrEmpty(stringified)) return null; return serializer.Deserialize(stringified, bindingContext.ModelType); } } } 

我的猜测是你从史蒂夫的下载开始,这是使用MVC2。 默认情况下,MVC2没有注册JsonValueProvider 。 [FromJson]属性旨在使用通过ko.utils.postJson(完全回发)提交的URL编码的JSON。 当使用正确的内容类型(在MVC3中)通过AJAX发布JSON时,这不是必需的。

因此,最简单的方法是将项目升级到MVC 3( 这里简单方法)并从部分更新中删除[FromJson]属性。

工作副本在这里 。

另一个非常小的事情:你的静态数据目前是无效的JSON( '{ gifts:[{"GiftId":0,"Title":"sad","Price":3}] }' )。 gifts需要是"gifts"