如何在 .GET 上忽略对象 属性 但在 .POST 上允许它?

How to ignore object property on .GET but allow it on .POST?

我的 c# web api 项目中有以下对象:

public class InfoUtente
{
    public string nome { get; set; }
    public string cognome { get; set; }
    public string cellulare { get; set; }
    public string email { get; set; }
    public bool termini { get; set; }
    public string fidelity { get; set; }

    public InfoUtente() { }
    public InfoUtente(string nome, string cognome, string cellulare, string email, string fidelity)
    {
        this.nome = nome;
        this.cognome = cognome;
        this.cellulare = cellulare;
        this.email = email;
        this.fidelity = fidelity;
    }
}

当对服务器进行 .POST 调用时 InfoUtente 被发布,在这种情况下我应该 忽略 fidelity 属性 并允许 termini

而当用户使用 .GET 请求数据时,我应该 return 整个对象 fidelity 但没有 termini.

我正在使用默认的序列化程序 (JSON.NET),并且我尝试在 termini 上使用 JsonIgnore 并在 .GET 中调用它 return是正确的 json 没有 termini 但是如果我尝试在 termini [=60 上使用 JsonIgnore 制作 InfoUtente.POST =], 它也会在 .POST 中被忽略,并且它的值在任何情况下都会被设置为 false..

所以我应该可以 .POST 一个 JSON 和

nome,cognome,cellulare,email,termini

并能够 .GET 它与

nome,cognome,cellulare,email,fidelity

我是否应该制作两个不同的对象,一个带 termini 且不带 fidelity 以在 .POST 中使用,另一个不带 termini 且带 fidelity 以用于 .GET 或者我可以只使用一个对象来实现它?

创建两个不同的类确实是最好的解决方案。

您可能想看看 Data Transfer Objects,因为它们也旨在实现您想要做的事情。

除了您的 InfoUtente 实体之外,您还将拥有两个 类。一个用于获取有关您感兴趣的特定实例的信息:

public class InfoUtenteDto
{
    public string nome { get; set; }
    public string cognome { get; set; }
    public string cellulare { get; set; }
    public string email { get; set; }
    public string fidelity { get; set; }
}

还有一个,用于创建新实例:

public class InfoUtenteForCreationDto
{
    public string nome { get; set; }
    public string cognome { get; set; }
    public string cellulare { get; set; }
    public string email { get; set; }
    public bool termini { get; set; }
}

一种可能的方法是使用自定义合同解析器的两个接口 class。假设除了您的 class 我们还有

public interface InfoUtentePost
{
    public string nome { get; set; }
    public string cognome { get; set; }
    public string cellulare { get; set; }
    public string email { get; set; }
    public bool termini { get; set; }
}

public interface InfoUtentGet
{
    public string nome { get; set; }
    public string cognome { get; set; }
    public string cellulare { get; set; }
    public string email { get; set; }
    public string fidelity { get; set; }
}

让我们创建一个合约解析器

public class InterfaceContractResolver : DefaultContractResolver
{
    private readonly Type _InterfaceType;
    public InterfaceContractResolver(Type InterfaceType)
    {
        _InterfaceType = InterfaceType;
    }

    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        //IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
        IList<JsonProperty> properties = base.CreateProperties(_InterfaceType, memberSerialization);
        return properties;
    }
}

实际上就是这样。我们现在唯一要做的就是使用 JsonConvert.SerializeObject 和一些参数:

InfoUtentePost product = new InfoUtente();

var settings = new JsonSerializerSettings()
{
    ContractResolver = new InterfaceContractResolver(typeof(InfoUtentePost))
};

string output = JsonConvert.SerializeObject(product, typeof(InfoUtentePost), settings);
 // output = "{\"nome\":null,\"cognome\":null,\"cellulare\":null,\"email\":null,\"termini\":false}"