使用HTTP GET进行模型绑定收集

时间:2016-10-24 15:09:51

标签: c# .net asp.net-core query-string asp.net-core-mvc

我想模拟绑定HTTP GET中的对象集合,如下所示:

public class Model
{
    public string Argument { get; set; }
    public string Value { get; set; }
}

[HttpGet("foo")]
public IActionResult GetFoo([FromQuery] IEnumerable<Model> models) { }

首先,在这种情况下,ASP.NET Core中的默认行为是什么? model binding documentation很稀疏但确实说我可以使用property_name[index]语法。

其次,如果默认值不好,我如何通过构建某种我可以重复使用的自定义模型绑定器来获得一个体面的URL,因为这是一个相当常见的场景。例如,如果我想绑定到以下格式:

  ?

Foo1 = BAR1&安培; foo2的= BAR2

以便创建以下对象:

new Model { Argument = "Foo1", Value = "Bar1" }
new Model { Argument = "Foo2", Value = "Bar2" }

1 个答案:

答案 0 :(得分:1)

没有太大变化since MVC 5。鉴于此模型和行动方法:

public class CollectionViewModel
{
    public string Foo { get; set; }
    public int Bar { get; set; }
}


public IActionResult Collection([FromQuery] IEnumerable<CollectionViewModel> model)
{

    return View(model);
}

您可以使用以下查询字符串:

?[0].Foo=Baz&[0].Bar=42 // omitting the parameter name
?model[0].Foo=Baz&model[0].Bar=42 // including the parameter name

请注意,您不能混用这些语法,因此?[0].Foo=Baz&model[1].Foo=Qux最终只能使用第一个模型。

默认情况下不支持不带索引的重复,因此?model.Foo=Baz&model.Foo=Qux不会填充您的模型。如果你的意思是“体面地看”,那么你需要创建一个自定义模型绑定器。