【问题标题】:Dotnet core MVC xml parameter binding always give nullDotnet core MVC xml参数绑定总是给null
【发布时间】:2017-06-25 06:31:18
【问题描述】:

我已经阅读了一些关于 SO 的问题,但解决方案都是针对 ASP.NET webApi 而不是 dotnet core。

我在 Startup.cs 中添加了 xml 支持

services
       .AddMvc()
       .AddXmlSerializerFormatters();

这是我的控制器方法:

[Route("main")]
    [HttpPost]
    public string MainPost([FromBody]MessageModel msg)
    {
        _log.LogInformation("body msg ="+msg.Content);
        return "test";
    }

这是我的 XML

 <xml>
 <ToUserName>toUser</ToUserName>
 <FromUserName>FromUser</FromUserName>
 <CreateTime>1348831860</CreateTime>
 <MsgType>text</MsgType>
 <Content>test content</Content>
 <MsgId>1234567890123456</MsgId>
</xml>

这是我的模型类:

[XmlRoot("xml")]
public class MessageModel
{

    public string ToUserName { get; set; }
    public string FromUserName { get; set; }
    public DateTime CreateTime { get; set; }
    public string MessageType { get; set; }
    public string Content { get; set; }
    public int MsgId { get; set; }
}

当我向这条路由发送 post 请求(带有标题“application/xml”)时,它总是给我 MessageModel msg 的 null

我在这里错过了什么?

我知道有一个 DataContract 的东西,但我无法控制 xml 格式发送 到我的服务器,所以我需要一种方法将上述格式的 xml 绑定到我的对象。

我们将不胜感激任何帮助或导致任何文档。

【问题讨论】:

  • 您遇到异常了吗?在代码中添加 try/catch。 CreateTime 将给出一个例外。我怀疑这可能是问题的原因。日期不是标准的日期时间格式,因此您需要为该类添加一个 get/put 属性,以便正确解析日期时间。
  • 试试[XmlRoot("MessageModel")]
  • @jdweng 我只在访问 null 'msg' 对象时遇到异常,我只是尝试将 CreateTime 类型更改为字符串,因此日期时间解析不应影响绑定。但不幸的是,它仍然给我空的味精......
  • @CodingYoshi 抱歉,我刚试过...仍然为空
  • @jdweng 你真棒,你刚才给我的想法帮我解决了问题,确实是解析元素值和存储到字段的问题。在我将模型类中的每个字段都更改为字符串后,msg 对象开始出现。请务必为这个问题写一个答案,你值得享有声誉!

标签: c# xml asp.net-mvc asp.net-core-mvc .net-core


【解决方案1】:

感谢@jdweng 的评论,我找到了问题所在,这让我对可能出现的问题有所了解。

问题是 XML 中有一些元素无法序列化为我的模型类中的指定类型。他们是DateTime CreateTimeint MsgId

因此将所有字段更改为字符串即可解决问题。

我不知道为什么 dotnet core 没有告诉我们这一点,而不是在由于这种原因绑定失败时给我们 null,这绝对是他们可以改进的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    相关资源
    最近更新 更多