MVC API:使用子元素构造XML响应
本文关键字:XML 响应 元素 API MVC | 更新日期: 2023-09-27 17:57:49
MVC非常新。我目前正在编写一个API,并且有一个严格的格式,我需要返回XML
目前,我正在使用EntityModel公开我的SQL存储过程。然后,我为SP创建了一个复杂类型。
我有一个正在调用SP的控制器,结果以XML形式返回。
这很好,但是,输出当前为(例如):
<product>
<productId>12345</productId>
<inStock>True</inStock>
<shelfLevel>10</shelfLevel>
<onOrder>0</onOrder>
<height>10</height>
<width>15</width>
<depth>12</depth>
<colour>green</colour>
</product>
然而,它需要被构造为:
<product>
<productId>12345</productId>
<availability>
<inStock>True</inStock>
<shelfLevel>10</shelfLevel>
<onOrder>0</onOrder>
</availability>
<dimensions>
<height>10</height>
<width>15</width>
<depth>12</depth>
</dimensions>
<colour>green</colour>
</product>
使用我当前的EntityModel和Complex Type组合方法,我看不到任何包含"availability"answers"dimensions"包装元素的方法。
以下是我从控制器为现有输出编写的代码:
// GET api/product/5
//ProductAvailability_Result is the Complex Type derived from the SP output columns
public IEnumerable<ProductAvailability_Result> Get(int id)
{
myDB_DevEntities db = new myDB_DevEntities();
//ProductAvailability is a SP consisting of a simple 'select' statement that returns the resultset
var Result = db.ProductAvailability(id);
return Result.ToList();
}
有人能为如何实现这一目标提供一些建议吗?我尝试使用上面的方法,即我应该放弃EntityModel,这是否完全是错误的做法?在我需要改变结构之前,它非常有效。
任何建议都将不胜感激。
您可以创建一个看起来像您想要的DTO(数据传输对象),但您必须进行一点数据转换。您将从定义与预期XML:的结构匹配的类结构开始
[XmlRoot("product")]
public class ProductDto
{
[XmlElement("productId")]
public int ProductId { get; set; }
[XmlElement("availability")]
public AvailabilityDto Availability { get; set; }
...
}
[XmlRoot("availability")]
public class AvailabilityDto
{
[XmlElement("inStock")]
public bool InStock { get; set; }
...
}
然后在API方法中,您可以在将DAO(数据访问对象)返回到客户端之前将其转换为DTO:
public ProductDto GetProductAvailability(id)
{
var result = db.ProductAvailability(id);
return new ProductDto
{
ProductId = result.productId,
Availability = new AvailabilityDto
{
InStock = result.inStock,
...
},
...
}
}
显然,这可能需要大量的工作,所以我也很好奇你的问题可能会出现其他什么答案。