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"
- 如何在ListBox中加载大量数据? ASP.NET MVC应用程序
- 在MVC中:通过jQuery复制视图元素并在相关控制器上检索它们的值
- 如何用jquery用Kendo开关显示百分比?
- jQuery在Ajax中调用ASP.NET MVC C#中的Action Method
- 如何在ASP.NET MVC中执行图像的Ajax / JQuery上载?
- Google Chrome的Javascript重定向问题
- 使用键值参数将JSON对象传递给ASP.NET MVC控制器方法
- asp.net mvc与jquery ajax cal HttpPostedFileBase文件获取空值
- 在Asp.net mvc中搜索和过滤JqGrid