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

时间:2019-11-28 16:05:36

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

我正在尝试通过查询参数绑定到一个复杂的对象,而我似乎只是在绑定第一个属性,其他所有东西都使用默认值(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中可能吗?如果是这样,我在做什么错?还有其他方法可以执行此操作,我可以设置正确绑定的路由参数,但是我将大量这样做,我希望只是传入模型并使用它而不是{ {1}}

编辑:

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

url/{paramters1}/{parameter2}/...,因此它与调试器中的请求匹配。

编辑第2部分:

我正在通过客户端中的jQuery {myurl}?Id=2100&Level=6&MyEnum=MyEnumValue发出请求。我进行了一次入侵.load({url}),并解决了我的一个问题,它正确地绑定了该属性。

谢谢大家的帮助!

2 个答案:

答案 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;', '&');

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