【问题标题】:Web API model validationWeb API 模型验证
【发布时间】:2014-12-18 09:11:47
【问题描述】:

我正在开发一个新的 Web API,并且我有一个用于 CRUD 操作的用户模型。但是,由于我们的业务性质,每当客户发布数据以创建新用户时,他们应该首先发送给我们他们的用户 ID,然后我们在内部创建自己的用户 ID,这个用户 ID 被发回,客户端现在应该使用我们提供给他们的这个新生成的 ID,以供将来对我们系统的任何参考。

问题: 我有一个具有属性的用户模型:

ExternalClientId :这是调用 API 的外部客户端将发送的 ID
UserId :这是我们系统新生成的 ID,将被发送回客户端。

现在在我的验证中,我需要确保用户始终在 POST 中传递 ExternalClientId,因为这是我生成新 ID 的关键,因此我有数据注释:

[Required]
ExternalClientId 

但是,当涉及到更新 (PUT) 时,用户应该传递生成的“UserId”,此时 ExternalClientId 不再是必需属性,我该如何在单个用户模型中管理它?

我还考虑为每种方法设置单独的用户模型,但我不确定这是否是正确的方法。

【问题讨论】:

    标签: c# validation asp.net-web-api2


    【解决方案1】:

    您可以将所需的字段逻辑移到方法本身中,如果模型未验证,则返回异常,或者更确切地说,将属性添加到 API 方法而不是模型。这样,POST 或 PUT 方法都可以接受相同的输入类,但其中只有一个需要 ExternalClientID 的有效字段

    为了使它更通用,你可以有一个这样的自定义属性:

    [RequiredField("ExternalClientID")]
    public ClientModel Post(ClientModel c) ...
    
    public ClientModel Put(ClientModel c) ...
    

    或者,您可以使用不同的模型,我认为这是一种完全有效的方法。

    【讨论】:

    • 有趣,我知道我根本不能使用注释,而只是在我的方法中编写自定义验证来检查 CREATE 与 UPDATE 中是否需要某些属性,但是我想探索自定义属性您提到的通用方法。
    • @MurtazaMandvi 完全披露:我没有编写很多自定义属性,因此可能需要进行一些调查和试验,但为了保持属性方法,我相信您可以解决一些问题。保持这样的通用性是一个很好的方法。您还必须考虑您的方法具有多个输入参数的情况。
    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多