我有一个非常简单的WCF数据服务应用程序,我正在做一些基本的CRUD操作。我在正在更改的实体集上有一个ChangeInterceptor,但ChangeInterceptor中的对象是数据库中的当前状态,而不是HTTP PUT中发送的状态。 有没有办法在保存对象之前验证对象的属性?
这是我的ChangeInterceptor:
[ChangeInterceptor("People")]
public void OnChangePerson(Person personChanging, UpdateOperations updateOperations) {
switch (updateOperations) {
case UpdateOperations.Change:
// personChanging is the database version here, not the changed version.
break;
default:
break;
}
}
这是我的客户端代码(jQuery):
var data = {
FirstName: "NewFN",
LastName: "NewLN"
};
$.ajax({
type: "PUT",
url: serviceUrl + "/People(" + personID + ")",
contentType: "application/json",
dataType: "json",
data: JSON.stringify(data),
success: function (data) {
alert("Success!");
},
error: function (error) {
alert("An error occured");
}
});
以下是发送到服务器的JSON:
收到消息时,这是ChangeInterceptor:
我已在此处上传了此项目的代码:http://andyjmay.com/test/2921612/ODataTest.zip
答案 0 :(得分:1)
WCF得到了一些很好的扩展,你可以像MessageInspector和ParameterInspector一样编写。 我确信其中一个可以帮助您在服务器开始处理请求之前验证内容。
答案 1 :(得分:1)
如果服务是基于EF的,并且请求是PUT,那么将提供旧值(这与EF提供程序的实现方式有关,可能是一个错误,我们将再研究一下)。您可以通过发送MERGE请求来解决此问题。我验证了,在这种情况下,它按预期工作(您获得新值)。 MERGE有一些不同的语义,但它可能对你有用。 PUT会覆盖实体,因此如果您没有为给定属性发送值,它将重置为其默认值。 MERGE仅使用有效负载中的值修改现有实体,因此如果某个属性不在有效负载中,则其值将保持不变。
答案 2 :(得分:1)
我下载了您的示例,重新解决了您的问题,并且现在可以使用此解决方法查看最新更新的值
我在内部调查此问题时,您是否可以更改代码以使用合并动词而不是PUT?
通过此更改,您现在应该能够在通过jQuery客户端更新值时看到传递给ChangeInterceptors的最新实体值。
$.ajax({
beforeSend: function (xhrObj) {
xhrObj.setRequestHeader("X-Http-Method", "MERGE");
},
type: "POST",
url: serviceUrl + "/People(" + personID + ")",
contentType: "application/json",
dataType: "json",
data: JSON.stringify(data),
success: function (data) {
GetAllPeople();
},
error: function (error) {
alert(error);
}
});
答案 3 :(得分:0)
嗯...你说personChanging是数据库版本,它肯定应该是更新版本。
我的测试(以及产品团队中的人员)告诉我它应该是通过电线传输的版本。还有别的东西会出问题吗?
例如,你的财产可能是名字而不是名字吗?