模型未绑定查询参数中的所有属性.Net Core 3.0 HTTP GET
Model not binding all properties in Query Parameters .Net Core 3.0 HTTP GET
我正在尝试通过查询参数绑定到一个复杂的对象,但我似乎只绑定了第一个 属性,其他所有对象都使用默认值(0、null、false 等)进行了初始化。 . . ).
HTTP 请求带有所有适用的 属性 名称和值。 属性 名称完全匹配。它绑定查询参数中的第一个 属性,但不绑定其他参数。当请求进来时,&
被替换为 &s;
。根据我在网上所做的研究,这些在模型活页夹眼中应该是相同的。这是我当前的设置
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;', '&');
这解决了我的一个问题,它正确地绑定了 属性。
我正在尝试通过查询参数绑定到一个复杂的对象,但我似乎只绑定了第一个 属性,其他所有对象都使用默认值(0、null、false 等)进行了初始化。 . . ).
HTTP 请求带有所有适用的 属性 名称和值。 属性 名称完全匹配。它绑定查询参数中的第一个 属性,但不绑定其他参数。当请求进来时,&
被替换为 &s;
。根据我在网上所做的研究,这些在模型活页夹眼中应该是相同的。这是我当前的设置
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;', '&');
这解决了我的一个问题,它正确地绑定了 属性。