我们如何在WebAPI中隐藏属性?

时间:2015-06-03 03:34:37

标签: c# asp.net-web-api

我有一个模型说

public class Device
{        
        public int DeviceId { get; set; }
        public string DeviceTokenIds { get; set; }
        public byte[] Data { get; set; }
        public string FilePwd { get; set; }        
}

现在我有一个ASP.net Web API,其中有一个POST方法,如

[HttpPost]
[Route("AddDeviceRegistrations")]
public void InsertDeviceRegistrations(Device device)

如果我公开WebAPI,显然所有字段都可用,例如

{
  "DeviceId": 1,
  "DeviceTokenIds": "sample string 2",
  "Data": "QEBA",
  "FilePwd": "sample string 3"
}

我想要的是,每当我公开我的WebAPI时,DeviceID都不会暴露。我的意思是我在寻找

{

      "DeviceTokenIds": "sample string 2",
      "Data": "QEBA",
      "FilePwd": "sample string 3"
}

有可能吗?如果是这样的话?

我可以通过将函数签名更改为

来解决问题
public void InsertDeviceRegistrations(string deviceTokenIds, byte[] data, string FilePwd).

但我想知道它是否可能? 如果是这样,怎么样?

提前致谢。

5 个答案:

答案 0 :(得分:18)

我刚想通了

[IgnoreDataMember]
 public int DeviceId { get; set; }

命名空间为System.Runtime.Serialization

更多信息IgnoreDataMemberAttribute Class

今天学到了新的东西。

全部谢谢。

答案 1 :(得分:2)

将View Models用于所有GET / POST请求是一种很好的做法。 在这种情况下,您应该创建用于在POST中接收数据的类:

public class InsertDeviceViewModel
{        
    public string DeviceTokenIds { get; set; }
    public byte[] Data { get; set; }
    public string FilePwd { get; set; }        
}

然后将数据从视图模型映射到业务模型Device

答案 2 :(得分:1)

在Property的顶部使用Attribute [NonSerialized]会阻止它在输出JSON / XML中被序列化。

public class Device
{        
        [NonSerialized]
        public int DeviceId { get; set; }

        public string DeviceTokenIds { get; set; }
        public byte[] Data { get; set; }
        public string FilePwd { get; set; }        
}

答案 3 :(得分:1)

如果要使用null参数隐藏Resonse类的数据成员。转到位于App_start文件夹中的项目WebApiConfig文件,添加以下代码:

var jsonConfig = config.Formatters.JsonFormatter;
jsonConfig.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;

答案 4 :(得分:0)

如果您使用的是Newtonsoft.Json

您可以这样隐藏属性:

public class Product
{
    [JsonIgnore]
    public string internalID { get; set; };
    public string sku { get; set; };
    public string productName { get; set; };
}

,并且您的序列化响应将不包含internalID属性。