我可以在保存更改之前验证实体吗?

时间:2010-09-23 19:07:18

标签: c# json wcf-data-services odata

我有一个非常简单的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: alt text

收到消息时,这是ChangeInterceptor: alt text

我已在此处上传了此项目的代码:http://andyjmay.com/test/2921612/ODataTest.zip

4 个答案:

答案 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是数据库版本,它肯定应该是更新版本。

我的测试(以及产品团队中的人员)告诉我它应该是通过电线传输的版本。还有别的东西会出问题吗?

例如,你的财产可能是名字而不是名字吗?