如何仅使用.NET MVC4从REST APIController中的Model返回特定字段的子集

时间:2013-09-20 10:04:53

标签: asp.net-mvc dto asp.net-apicontroller

我正在编写一个Web API,客户端可以请求以XML格式返回数据。我正在使用Enterprise Foundation和MVC4在.NET中实现它。

我正在努力解决如何仅从控制器中的模型中返回某些字段的子集。

为了论证,我们假设我的产品型号包含属性“Id”,“Name”,“Price”和“Actual Cost”(我使用http://www.asp.net/web-api/overview/creating-web-apis/using-web-api-with-entity-framework/using-web-api-with-entity-framework,-part-6中的示例)

我需要为客户端公开Web API以查询特定产品以获取其名称和价格,但在此响应中我不想返回“实际成本”属性(因为这是我们的秘密)。 / p>

现在在我提供的链接中,这正是他们试图通过使用DTO解决的问题(他们定义了一个名为ProductDTO的DTO,它只包含我想要返回的子集)。我已经实现了这个解决方案,我现在确实只能返回我在DTO中指定的字段。

问题是XML中返回实体的命名现在是ProductDTO而不是Product,即返回的XML是

{"ProductDTO":[{"Id":1,"Name":"Tomato Soup","Price":1.39}, {"Id":3,"Name":"Yo yo","Price":6.99]}

而不是

{"Product":[{"Id":1,"Name":"Tomato Soup","Price":1.39}, {"Id":3,"Name":"Yo yo","Price":6.99]}

这意味着我们当前使用我们的API并期望返回“产品”的所有客户现在都会返回“ProductDTO”,这意味着他们必须对其代码进行更改,这是不可接受的。我需要为他们提供一个“产品”,其中只包含他们目前获得的相关子字段集。我该如何实现这一目标?我不能简单地“忽略”prevent property from being serialized in web api中建议的数据成员,因为我也有一些API情况,我确实需要返回所有属性,而不仅仅是一个子集。

只是一些背景知识:我们有一个用Ruby on Rails编写的现有API服务器接口,现在我们将其转移到C#和.NET MVC4。我们还有一堆客户端应用程序已经连接到我们现有的旧版Ruby on Rails API服务器,我们不希望客户端对其代码进行任何更改。我们只是将我们的API服务器代码从Ruby on Rails转移到C#。在Ruby on Rails中,当我只需要在某些调用中返回属性的子集时,我就能够将过滤器应用于XML Serializer。

2 个答案:

答案 0 :(得分:0)

假设您有类似

的类
public class product
{
public string Name{get; set;}
..
}

并且您不希望在响应中显示它,只需使用 [XMLIgnore] 属性

[XMLIgnore]
public string Name{get; set;}

希望这会有所帮助。

答案 1 :(得分:0)

如果你想继续你已经开始的DTO路线,哪个恕我直言是一个好主意,因为它让你控制你导出的东西而不会用导出特定的东西污染你的内部类,你可以添加一个DataContract属性到你的ProductDTO类。

[DataContract(Name="Product")]
public class ProductDTO
{
    [DataMember]
    public int Id {get;set;}
    [DataMember]
    public string Name {get;set;}
}

Web API中使用的默认XML格式化程序是DataContractSerializer。 您可以阅读有关此here

的更多信息