Asp.net web api 对于webapi v2 odata,Jaydata更新无法正常工作

Asp.net web api 对于webapi v2 odata,Jaydata更新无法正常工作,asp.net-web-api,odata,jaydata,asp.net-web-api-odata,Asp.net Web Api,Odata,Jaydata,Asp.net Web Api Odata,我已初始化jaydata上下文: $data.initService('/odata/$metadata', { dataServiceVersion: '3.0' }).then(function (context) { if (!mycontext) mycontext= context; //this is a hack mycontext.prepareRequest = function (r) { if (r[0].method

我已初始化jaydata上下文:

$data.initService('/odata/$metadata', { dataServiceVersion: '3.0' }).then(function (context) {
    if (!mycontext)
        mycontext= context;

   //this is a hack
    mycontext.prepareRequest = function (r) {
        if (r[0].method == "PATCH") {
            r[0].method = 'PUT';
            r[0].headers['X-HTTP-METHOD'] = 'UPDATE';
        }
    };

    vm.roles = mycontext.Role.toLiveArray();
    vm.users = mycontext.User.toLiveArray();
});
mycontext.prepareRequest的解决方法是在找到

已初始化角色和用户的列表已成功显示。但是,我在更新实体时仍遇到问题:

vm.updateRole = function (r) {
    r.Name = 'NewUpdatedName';
    zivacontext.Role.attach(r);
    r.entityState = $data.EntityState.Modified;
    zivacontext.saveChanges().then(function (result) {
        debugger;
    });

};
请求重定向到下面提供的控制器的UpdateEntity方法,但只设置了实体的Id属性。其他属性为NULL,如果请求被重定向到PatchEntity方法(当未应用解决方法时),则更改的字段不会传递到增量。在这两种情况下的请求有效负载中(无论是否有黑客攻击),只有Id被传递到服务器

控制员:

公共类BaseODataController:EntitySetController 地点:班级 第十天在哪里上课 其中,TIdentityType:class where-TService:ICrudService { //

受保护的覆盖TentityTo UpdateEntity(TIdentityType键,TentityTo更新) { _服务。更新(更新); 返回base.UpdateEntity(键,update); }

    protected override TEntityDto PatchEntity(TIdentityType key, Delta<TEntityDto> patch)
    {
        return base.PatchEntity(key, patch);
    }
我唯一不明白的是为什么ValidationErrors出现在_changedProperties中:

_changedProperties: Array[2]
  0: MemberDefinition
    configurable: true
    dataType: function Array() { [native code] }
    definedBy: function Entity(){
    elementType: function ValidationError(){
    enumerable: false
    kind: "property"
    monitorChanges: true
    name: "ValidationErrors"
    notMapped: true
    originalElementType: function ValidationError(){
    originalType: function Array() { [native code] }
    storeOnObject: true
    type: function Array() { [native code] }
    __proto__: MemberDefinition
所以这里的问题是为什么更改没有在请求负载中传递到服务器


提前感谢!

在初始化时使用
maxDataServiceVersion
而不是
dataServiceVersion

我不知道你为什么需要上面的技巧,特别是当你将它与一个未知动词一起使用时,比如
UPDATE
。在OData中,有两个允许的HTTP动词
MERGE
用于V2,而
PATCH
用于V3。一旦你设置
maxDataServiceVersion:3.0
JayData将发出正确的
PATCH
请求

您正在使用的黑客应该应用于另一种情况,即客户端、代理、路由器都不支持这两个动词。在这种情况下,您应该发送POST请求,并将所需动词设置为
X-HTTP-Method
。此方法通常称为动词隧道,请参见例如

根据评论更新

我会通过控制台检查上下文。确保
ctx
在全球可用,例如

window.ctx = context;
通过ID附加某物,例如

var role = ctx.Role.attachOrGet({ID: 'GUID or Int'});
角色。
将允许您访问实体属性,例如假定状态为接受Int的
属性

role.Status = 1; //Set role.Status to 1

上次运行
ctx.saveChanges()
。如果一切设置正确,JayData将向
/odata/Role/GUID
端点发送一个补丁请求,并将更改作为JSON负载。

@RainerAtSprint感谢您的回答。问题是增量(已更改的字段)没有在请求负载中传递。或者我在这里缺少什么吗?不确定您是否缺少什么,但假设
r
是一个有效实例,我会尝试将
r
附加到上下文中。因此,我不会将
zivacontext.Role.attach(r);
->
zivacontext.attach(r)
同样的问题,也有问题。我已经用一些步骤更新了答案,这些步骤允许您检查上下文是否正常工作。此外,在url中,您应该使用/odata,而不是/odata/$metadata
var role = ctx.Role.attachOrGet({ID: 'GUID or Int'});
role.Status = 1; //Set role.Status to 1