我正在尝试通过查询参数绑定到一个复杂的对象,而我似乎只是在绑定第一个属性,其他所有东西都使用默认值(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的。 2.2及更早版本,以及POST和WebApi的版本。
.Net 3.0中可能吗?如果是这样,我在做什么错?还有其他方法可以执行此操作,我可以设置正确绑定的路由参数,但是我将大量这样做,我希望只是传入模型并使用它而不是{ {1}}
编辑::
当我打开chrome调试器并单击“网络”标签时,呼叫看起来像这样。
url/{paramters1}/{parameter2}/...
,因此它与调试器中的请求匹配。
编辑第2部分:
我正在通过客户端中的jQuery {myurl}?Id=2100&Level=6&MyEnum=MyEnumValue
发出请求。我进行了一次入侵.load({url})
,并解决了我的一个问题,它正确地绑定了该属性。
谢谢大家的帮助!
答案 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; }
}
答案 1 :(得分:0)
我通过客户端中的 jQuery .load({url})
发出请求。我做了一个黑客
var url = url.replace('%amp;', '&');
这解决了我的一个问题,并且正确绑定了属性。