代码之家  ›  专栏  ›  技术社区  ›  Andy May

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

  •  2
  • Andy May  · 技术社区  · 14 年前

    我有一个非常简单的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;
        }
    }
    

    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

    alt text

    我在这里上传了这个项目的代码: http://andyjmay.com/test/2921612/ODataTest.zip

    4 回复  |  直到 14 年前
        1
  •  1
  •   Phani Raj    14 年前


    我下载了你的样本,重新修改了你的问题,并能够看到最新的更新价值使用这项工作,目前。
    当我在内部对此进行研究时,您能将代码更改为使用合并动词而不是PUT吗?

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

        2
  •  1
  •   Chen Kinnrot    14 年前

    WCF有一些很好的扩展,你可以写像MessageInspector和ParameterInspector。 我确信其中一个可以在服务器开始处理请求之前帮助您验证内容。

        3
  •  1
  •   Vitek Karas MSFT    14 年前

    如果服务是基于EF的,并且请求被放入,那么将提供旧值(这与EF提供者的实现方式有关,可能是一个bug,我们将进一步研究)。您可以通过发送合并请求来解决这个问题。我验证了,在这种情况下,它按预期工作(您将获得新值)。MERGE有一点不同的语义,但它可能适合您。PUT将覆盖实体,因此如果您没有发送给定属性的值,它将重置为其默认值。MERGE只使用有效负载中的值修改现有实体,因此如果某个属性不在有效负载中,则其值将保持不变。

        4
  •  0
  •   Alex James    14 年前

    隐马尔可夫模型。。。你说PersonChange是数据库版本,它肯定是更新版本。

    我的测试(以及产品团队中的人员)告诉我,它应该是已经发布的版本。会不会出什么问题了?

    例如,您的属性可以是Firstname而不是Firstname吗?