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'和'dimension'包装元素的任何方法。
以下是来自控制器的现有输出代码:
// 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?它很有效,直到我需要改变结构。
非常感谢任何建议。
答案 0 :(得分:0)
您可以创建一个看起来像您喜欢的DTO(data transfer object),但您必须进行一些数据转换。您首先要定义与预期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,
...
},
...
}
}
显然这可能相当于大量的工作,所以我很好奇你的问题的其他答案可能会出现。