如何绑定XML属性与MVC的Web API的动作模式?(How do I bind XML Attr

2019-09-17 07:27发布

这可能是在框架中的β版本中的错误,或者我做一些可怕的错误与我的班。

我已经得到了我想要通过POST接收到对我的服务的动作的基本模型。 该模型包含一些属性的XML元素和一些属性为XML属性。 元素被绑定到模型成功,但属性被忽略。

该模型的基本形式是:

[XmlRoot]
public class Entry
{
    [XmlAttribute]
    public string Label { get; set; }

    [XmlElement]
    public Link Parent { get; set; }

    [XmlElement]
    public string Data { get; set; }
}

public class Link
{
    [XmlElement]
    public string Href { get; set; }
}

这成功地连载以下XML响应。

<Entry Label="Test">
  <Parent Href="http://service/entries/123" />
  <Data>WibblyWobblyTimeyWimey</Data>
</Entry>

在发送请求回用相同的XML服务,我可以看到,只有数据元素被成功地坚持着。

调查的HttpActionContext表明RequestKeyValueModel属性只包含键“数据”和“父母”,而只有“数据”有一个值。

我测试手动条目的反序列化,并可以成功反序列化使用简单的测试客户端供电所的响应System.Net.Http.HttpClient读请求作为一个对象(和行使MediaTypeFormatter在过程中)。

有一些诀窍我已经错过了,有的设置地方,比如我已经忽略了? 我相信问题出在IActionBinder试图将值从反序列化的XML请求对动作的参数绑定,但是我没有,为什么其它任何信息。

Answer 1:

我了解到,这是与现款车型有问题的框架的Beta版本绑定来实现(因为随后改善)。

本文提出的解决办法是禁用模式,取而代之的是简单的“序列化”模式的结合 ,这听起来接近我其实是想。

不幸的是,作为一个副作用,这种退出所有的路由参数绑定过的,所以我不再从URL获取任何参数,并没有缺失值的行动将不会执行。

不过,我设法解决通过将以下属性这个问题:

public class AddRouteParametersAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var descriptor = actionContext.ActionDescriptor
            as ReflectedHttpActionDescriptor;
        var parameters = descriptor.MethodInfo.GetParameters();

        foreach (var key in actionContext.ActionArguments.Keys.ToList())
        {
            if (actionContext.ActionArguments[key] == null)
            {
                var parameter = parameters
                    .SingleOrDefault(param => param.Name == key);

                var valueProvider = new RouteDataValueProvider(
                    actionContext,
                    CultureInfo.InvariantCulture);

                var result = valueProvider.GetValue(key);

                if (result != null && parameter != null)
                {
                    actionContext.ActionArguments[key]
                        = result.ConvertTo(parameter.ParameterType);
                }
            }
        }

        base.OnActionExecuting(actionContext);
    }
}

这是一个有点这些混沌(因为所有的最好的解决方法应该是),但它使用现有的RouteDataValueProvider类阅读作为每当参数没有通过正常的反序列化过程填入正确类型的路由信息。 我敢肯定有情况下,它不会工作,但到目前为止,它填补了我需要填充和解决问题,我不必真的下探深入到框架的差距。

我们希望,如果你有类似的问题,你可以参考这个代码,直到RC,在这一点上,我们要确保这些问题消失。



文章来源: How do I bind XML Attributes to the action model in MVC Web API?