Asp.Net MVC 3 ModelBinding Arrays

时间:2011-10-11 21:16:54

标签: asp.net-mvc-3 model-binding

我发布的内容如下:

  FavoritePerson: "Dennis"
  FavoriteAnimals: [{Type="Bear", Name="Bruno"}, {Type="Shark", Name="Sammy"}, ...]

Model是否有一些形状可以让DefaultModelBinder能够处理这个?像

这样的东西
class FavoriteAnimalSubmission {
  string Type {get; set;}
  string Name {get; set;}
}
[HttpPost]
public MarkFavorites(string favoritePerson, FavoriteAnimalSubmission[] favoriteAnimals[]) {
...
}

将填充favoritePerson和favoriteAnimals.Count,但不会填充每只动物的属性。

1 个答案:

答案 0 :(得分:0)

没有开箱即可处理JSON(在您的情况下无效)和标准url编码参数的混合物。如果您需要处理此请求,则必须编写自定义模型绑定器。或者只是将您的请求修改为:

{
    "FavoriteAnimals": [
        {
            "Type": "Bear",
            "Name": "Bruno"
        },
        {
            "Type": "Shark",
            "Name": "Sammy"
        }
    ],
    "FavoritePerson": "Dennis"
}

然后在服务器上:

public class MyViewModel
{
    public string FavoritePerson { get; set; }
    public FavoriteAnimalSubmission[] FavoriteAnimals { get; set; }
}

public class FavoriteAnimalSubmission
{
    public string Type { get; set; }
    public string Name { get; set; }
}

和您的控制器操作:

[HttpPost]
public MarkFavorites(MyViewModel model) 
{
    ...
}

以及调用它的AJAX请求:

var model = 
    {
        "FavoriteAnimals": [
            {
                "Type": "Bear",
                "Name": "Bruno"
            },
            {
                "Type": "Shark",
                "Name": "Sammy"
            }
        ],
        "FavoritePerson": "Dennis"
    };

$.ajax({
    url: '@Url.Action("MarkFavorites", "SomeController")',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(model),
    success: function(result) {
        // do something with the result
    }
});