MVC API:使用子元素构建XML响应

时间:2013-02-06 10:35:57

标签: c# xml asp.net-mvc api structure

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?它很有效,直到我需要改变结构。

非常感谢任何建议。

1 个答案:

答案 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,
             ...
        },
        ...
    }
}

显然这可能相当于大量的工作,所以我很好奇你的问题的其他答案可能会出现。