【发布时间】: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