Asp.net web api 对于webapi v2 odata,Jaydata更新无法正常工作
我已初始化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
$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