我正在研究KnockOutJs示例,并且在MVC3中遇到一些发布问题。当使用整页回发时,我的示例可以正确发帖。当我尝试使用jQuery Ajax帖子进行保存时,可以在使用Firebug NET查看器中看到该帖子为:

{礼物:[{“ GiftId”:0,“标题”:“悲伤”,“价格”: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<Gift> gifts)
{
    gifts = gifts ?? new List<Gift>();
    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<Gift> 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的Steve下载开始。默认情况下,MVC2没有注册JsonValueProvider[FromJson]属性旨在用于通过ko.utils.postJson(完整回发)提交的URL编码的JSON。通过具有正确内容类型(在MVC3中)的AJAX发布JSON时,这不是必需的。

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

工作副本here

另一件非常小的事情:您的静态数据当前是无效的JSON('{ gifts:[{"GiftId":0,"Title":"sad","Price":3}] }')。 gifts必须为"gifts"

关于jquery - KnockOutJs对象未发布,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8542007/

10-13 08:39
查看更多