我是 ASP.NET Web API 的新手。
我看到了如何在 RESTful Web 应用程序中获取和返回 POCO 的示例。
我想知道在现实世界的应用程序中,您如何只能传递 POCO 的一些属性(出于安全和/或消息大小的原因)。
我发现我可以使用“[ScriptIgnore]”属性,但我正在寻找一种方法来自定义根据请求控制器传递哪些属性,例如。
是否有一种很好的、开箱即用的方式来做到这一点?
谢谢
我是 ASP.NET Web API 的新手。
我看到了如何在 RESTful Web 应用程序中获取和返回 POCO 的示例。
我想知道在现实世界的应用程序中,您如何只能传递 POCO 的一些属性(出于安全和/或消息大小的原因)。
我发现我可以使用“[ScriptIgnore]”属性,但我正在寻找一种方法来自定义根据请求控制器传递哪些属性,例如。
是否有一种很好的、开箱即用的方式来做到这一点?
谢谢
可能最简单的方法是装饰你的 POCOSystem.Runtime.Serialization.DataContractAttribute
和你想要包含的成员,System.Runtime.Serialization.DataMemberAttribute
即
[DataContract]
public class MyType
{
[DataMember]
public string Property1 {get; set;}
public string Property2 {get; set;}
public string Property3 {get; set;}
}
在这种情况下,只会Property1
被序列化。值得注意的是,两者XmlMediaTypeFormatter
都会JsonMediaTypeFormatter
尊重DataContract
,因此您不需要任何 XML/JSON 特定的属性。
现在,这将在更简单的解决方案中起作用,对于一个真正的、全面的方法,您可能需要求助于 DTO 而不是将模型暴露给客户端。
您可以使用Automapper
它,并将模型投影到 DTO - 您在这里有一篇很好的介绍性文章http://www.mono-software.com/blog/post/Mono/120/Using-AutoMapper-to-handle-DTOs/。此外,使用 Automapper,您可以从同一个基本模型创建不同类型的 DTO,据我所知,这是您感兴趣的东西。
如果您试图从不同的控制器返回同一模型的多个表现形式,那么这是一种有害的设计(根据我的说法)。如果您仍然想这样做,您可以将不需要的属性设置为“null”并返回模型。
要处理从序列化中忽略的空对象,您必须在配置格式化程序时在某处执行此操作(在 global.asax 中):
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;