Asp.Net Массивы привязки моделей MVC 3

#asp.net-mvc-3 #model-binding

#asp.net-mvc-3 #привязка модели

Вопрос:

Я публикую что-то похожее на это:

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

Есть ли какая-то форма для модели, чтобы DefaultModelBinder мог справиться с этим? Что-то вроде

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

Заполнит favoritePerson и favoriteAnimals.Подсчитывайте, но не свойства каждого животного.

Ответ №1:

Нет ничего готового, что могло бы обрабатывать смесь 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
    }
});
  

Комментарии:

1. Хм, я не смешиваю параметры запроса и публикации, я делаю то же самое, что и вы. Вы хотите сказать, что это должно работать? Может быть, я что-то упускаю.