模型未绑定查询参数中的所有属性.Net Core 3.0 HTTP GET

Model not binding all properties in Query Parameters .Net Core 3.0 HTTP GET

我正在尝试通过查询参数绑定到一个复杂的对象,但我似乎只绑定了第一个 属性,其他所有对象都使用默认值(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 3.0 的。 Net Core 2.2 及更早版本,以及 POST 和 WebApi 的。

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

编辑:

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

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

编辑第 2 部分:

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

谢谢大家的帮助!

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; }
}

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

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

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