在ASP.NET Web API中是否有@JsonView等效

Iva*_*vic 5 c# java asp.net spring

我在Spring和Java方面有很多经验,但现在我正在开发ASP.NET Web API项目.

所以在Spring中有@JsonView注释,我可以用它来注释我的DTO,所以我可以选择通过REST显示哪些数据.而且我发现它非常有用.但我在ASP.NET中找不到任何等价物.所以我需要为每个特殊用例创建DTO.

因此,例如在Java中,如果我有UserEntity包含有关用户的信息.有些信息可以公开查看,有些信息只能由管理员查看.siple解决方案可能就是这样

public class UserEntity {
  @JsonView(Views.Public.class)
  @JsonProperty("ID")
  private Integer id;

  @JsonView(Views.Public.class)
  private String name;

  @JsonView(Views.Admin.class)
  @JsonFormat(
  shape = JsonFormat.Shape.STRING, 
  pattern = "dd-MM-yyyy hh:mm:ss")
  private Date dateOfBirth;

  @JsonView(Views.Admin.class)
  private String email;

  @JsonIgnore
  private String password;
  private Integer version;
}
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,对于ASP.NET中的等效功能,我需要创建2个DTO.一个可以公开看到的用户和一个只能由管理员看到的用户.

public class PublicUserDto {

  public int ID {get; set;}

  public String Name {get; set;}

}

public class AdminUserDto {

  public int ID {get; set;}

  public String Name {get; set;}

  public DateTime DateOfBirth {get; set;}

  public string Email {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的解决方案?是否有一些机制可用于在ASP.NET Web API中创建我的数据视图?

har*_*ded 2

JSON.NET 有一个叫做“条件属性初始化”的东西。您可以编写以下格式的方法:

public bool ShouldSerialize[YourPropertyName]() => someBoolCondition;
Run Code Online (Sandbox Code Playgroud)

JSON.NET 将调用该方法来确定是否应该序列化该属性。所以你可以有类似的东西:

public DateTime DateOfBirth {get; set;}

public bool ShouldSerializeDateOfBirth() => isAdmin;
Run Code Online (Sandbox Code Playgroud)

它并不那么漂亮,JsonView但它应该可以完成工作。