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

pri*_*kar 9 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; }        
}
Run Code Online (Sandbox Code Playgroud)

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

[HttpPost]
[Route("AddDeviceRegistrations")]
public void InsertDeviceRegistrations(Device device)
Run Code Online (Sandbox Code Playgroud)

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

{
  "DeviceId": 1,
  "DeviceTokenIds": "sample string 2",
  "Data": "QEBA",
  "FilePwd": "sample string 3"
}
Run Code Online (Sandbox Code Playgroud)

我想要的是,每当我暴露我的WebAPI时,DeviceID都不应该暴露.我的意思是我在寻找

{

      "DeviceTokenIds": "sample string 2",
      "Data": "QEBA",
      "FilePwd": "sample string 3"
}
Run Code Online (Sandbox Code Playgroud)

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

我可以通过更改函数签名来解决问题

public void InsertDeviceRegistrations(string deviceTokenIds, byte[] data, string FilePwd).
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

pri*_*kar 24

我才想通了

[IgnoreDataMember]
 public int DeviceId { get; set; }
Run Code Online (Sandbox Code Playgroud)

命名空间是 System.Runtime.Serialization

更多信息IgnoreDataMemberAttribute类

今天学了点儿新东西.

谢谢大家.


rno*_*nko 5

对所有 GET/POST 请求使用视图模型是一种很好的做法。在您的情况下,您应该创建用于在 POST 中接收数据的类:

public class InsertDeviceViewModel
{        
    public string DeviceTokenIds { get; set; }
    public byte[] Data { get; set; }
    public string FilePwd { get; set; }        
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

如果您正在使用Newtonsoft.Json

您可以像这样隐藏属性:

public class Product
{
    [JsonIgnore]
    public string internalID { get; set; };
    public string sku { get; set; };
    public string productName { get; set; };
}
Run Code Online (Sandbox Code Playgroud)

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