0

我正在利用 MVC4 中的 Web API 为我的 Web 服务提供一个简单的 API。[XmlType]我已经阅读了关于在模型上使用,等的各种帖子,[XmlRoot][XmlElement]在根元素和包装每个实体的元素上设置自定义名称,但它们似乎都没有效果。API 总体上运行良好,但 XML 属性似乎没有效果,给我留下了不相关的元素名称。

我已经稍微简化了我的代码,以使示例更清晰,但这基本上是它的样子:

API控制器:

public class SomeController : ApiController
{
    [HttpGet]
    public List<MyViewModel> All()
    {
        return ApiProvider.All()
                        .Select(v => new MyViewModel
                        {
                            SomeId = v.SomeId
                            SomeValue = v.SomeValue
                        }).ToList();
    }
}

我的视图模型:

public class MyViewModel
{
    public int SomeId { get; set; }
    public int SomeValue { get; set; }
}

当前的 XML 响应:

<ArrayOfMyViewModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns="http://schemas.datacontract.org/2004/07/...">
    <MyViewModel>
        <SomeId>3</SomeId>
        <SomeValue>My value</SomeValue>
    </MyViewModel>
</ArrayOfMyViewModel>

所需的 XML 响应:

<CustomRootName xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns="http://schemas.datacontract.org/2004/07/...">
    <CustomEntityName>
        <SomeId>3</SomeId>
        <SomeValue>My value</SomeValue>
    </CustomEntityName>
</CustomRootName>

我没有对我想使用的序列化程序或类似的东西进行任何配置更改。

我在这里遗漏了什么,或者为什么我不能更改元素的名称?是否有其他方法可以采取,或者我缺少一些必要的设置?

4

1 回答 1

1

你就不能上课吗

CustomRootName : List<MyViewModel>

并返回一个 CustomRootName 的实例?


[我对您的评论的回复如下]

是的,这是我在启动 api 时的观点,但 ArrayOfMyViewModel 本质上是由序列化程序创建的伪包装器,并且为每个资源列表创建一个行包装器就是一个绑定。考虑当您的 api 变得更复杂并且您需要支持更复杂的列表类型时,即:

<CustomRootName >
    <RootType>typeB</RootType>
    <CustomEntityName>
        <SomeId>3</SomeId>
        <SomeValue>My value</SomeValue>
    </CustomEntityName>
    <CustomEntityName>
...etc
    </CustomEntityName>
</CustomRootName>

您将从一致的界面中受益。我们发现的另一个好处是文档。我们使用 xml-doc 标签记录我们的代码,然后使用 xslt 和一些反射自动生成 api 用户指南。如果您没有包装类,那么可以在此处挂起 xml-doc 标记。所以最初看起来很痛苦,但我很快就被说服了。

于 2012-08-28T15:08:45.177 回答