gpt4 book ai didi

jquery - KnockOutJs 对象未发布

转载 作者:行者123 更新时间:2023-12-01 07:27:41 25 4
gpt4 key购买 nike

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

{ 礼物:[{"GiftId":0,"Title":"sad","Price":3}] }

当我在MVC3中的ModelBinder中查看ControllerContext时,表单参数为空,并且json没有绑定(bind)。对正在发生的事情有什么想法吗?

我尝试了多种配置,但这里是 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");
}

使用此自定义模型绑定(bind)器:

        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);
}
}
}

最佳答案

我的猜测是您从 Steve 的下载开始,它使用的是 MVC2。 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com