【问题标题】:Model not binding all properties in Query Parameters .Net Core 3.0 HTTP GET模型未绑定查询参数.Net Core 3.0 HTTP GET中的所有属性
【发布时间】:2019-11-28 16:05:36
【问题描述】:

我正在尝试通过查询参数绑定到一个复杂的对象,我似乎只绑定了第一个属性,其他所有内容都使用默认值(0、null、false 等...)进行初始化。

HTTP 请求带有所有适用的属性名称和值。属性名称完全匹配。它绑定查询参数中的第一个属性,但不绑定其他属性。当请求进来时,& 被替换为&amps;。根据我在网上所做的研究,这些在模型绑定器的眼中应该是相同的。这是我目前的设置

public class MyComplexObject
{
    public string Id { get; set; }
    public int Level { get; set; }
    public Enum MyEnum { get; set; }
}
[HttpGet]
public IActionResult MyAction( [FromQuery] MyComplexObject model)
{
    // stuff done here.  model.Id is set to the correct value, everything
    // else is set to an initialized value based on type. 

    return View("view", model)
}

这是在 MVC .Net Core 3.0 Web 项目(不是 API)中。

当我调试动作并查看this.Request.QueryString 它显示"?Id=2100&Level=6&MyEnum=MyEnumValue" 所以值被传入,我无法让它绑定到其余属性,它正确绑定了第一个属性在查询字符串 (Id) 中。

我能找到的所有资料都说这是我应该通过 QueryParameters 设置复杂对象的方式,但是我找不到任何决定性的信息来判断这是否适用于 .Net Core 3.0,我阅读的所有内容都是针对 .Net Core 2.2 及更早版本,以及用于 POST 和 WebApi 的。

这在 .Net 3.0 中可行吗?如果是这样,我做错了什么?还有其他方法可以做到这一点,我可以设置正确绑定的路由参数,但我会做一堆,我希望只是传入我的模型并完成它而不是@ 987654329@

编辑:

当我打开 chrome 调试器并单击网络标签时,调用看起来像这样。

{myurl}?Id=2100&Level=6&MyEnum=MyEnumValue 所以它匹配调试器中的请求。

编辑第 2 部分:

我通过客户端中的 jQuery .load({url}) 发出请求。我做了一个 hack var url = url.replace('%amp;', '&');,解决了我的一个问题,它正确地绑定了属性。

谢谢大家的帮助!

【问题讨论】:

  • 似乎有什么东西破坏了 URL,它绝对不应该使用& 而不是&。这告诉模型绑定器属性名称是amp;Level,它不是。无论是构建 URL 并指导客户端发出请求,都以某种方式对您的值进行 HTML 编码。问题是在你得到这个代码之前。 (注意:您可以通过手动输入正确的 URL 并查看模型如何绑定来快速测试。)
  • 您是如何提出请求的?看起来 URL 被客户端破坏了。客户端代码是否对 整个 字符串使用了 HTML 编码而不是单个参数?
  • 关于 URL/{parameter1}/... 这个链接可能对你有帮助 docs.microsoft.com/en-us/aspnet/core/fundamentals/…
  • 好的,肯定是&。我通过客户端中的 jQuery .load({url}) 发出请求。我想我现在可以解决这个问题。

标签: c# .net-core model-binding asp.net-core-3.0 .net-core-3.0


【解决方案1】:
public class MyComplexObject
{
[FromQuery(Name = "Id")]
public string Id { get; set; }
[FromQuery(Name = "Level")]
public int Level { get; set; }
[FromQuery(Name = "MyEnum")]
public Enum MyEnum { get; set; }
}

【讨论】:

  • 能否在 chrome 调试器中打开网络并将请求添加到详细信息中?
  • 匹配调试器中的请求。我认为这与&amps; 有关
  • 查询应该是这样的 "?Id=2100&Level=6&MyEnum=MyEnumValue" 我不知道'amp;'是从哪里来的
【解决方案2】:

我通过客户端中的 jQuery .load({url}) 发出请求。我做了一个 hack

var url = url.replace('%amp;', '&');

这解决了我的一个问题,它正确地绑定了属性。

【讨论】:

    猜你喜欢
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2016-09-14
    • 2021-09-05
    相关资源
    最近更新 更多