C# Web API模型验证

C# Web API模型验证,c#,validation,asp.net-web-api2,C#,Validation,Asp.net Web Api2,我正在开发一个新的Web API,我有一个用于CRUD操作的用户模型。但是,由于我们业务的性质,每当客户发布数据以创建新用户时,他们应该首先向我们发送他们的用户id,然后我们在内部创建我们自己的用户id,然后这个用户id被发送回来,客户端现在应该使用我们给他们的这个新生成的id,以便将来引用我们的系统 问题是: 我有一个具有以下属性的单用户模型: ExternalClientId:这是调用API的外部客户端将发送的ID UserId:这是从我们的系统中新生成的ID,它将被发送回客户端 现在在我的

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

问题是: 我有一个具有以下属性的单用户模型:

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

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

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


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

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

要使其更通用,可以使用如下自定义属性:

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

public ClientModel Put(ClientModel c) ...

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

有趣的是,我知道我根本不能使用注释,只需在方法中编写自定义验证,以检查CREATE vs UPDATE中是否需要某些属性,不过,我想探索一下您提到的自定义属性通用方法。@MurtazaMandvi完整披露:我没有写过很多自定义属性,因此可能需要一些调查和实验,但为了坚持使用属性方法,我相信您可以解决一些问题。保持通用性是一个很好的方法。您还必须考虑方法具有多个输入参数的情况。