Asp.Net MVC 3 ModelBinding Arrays - PullRequest
       3

Asp.Net MVC 3 ModelBinding Arrays

1 голос
/ 12 октября 2011

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

  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[]) {
...
}

Заполнит фаворитовых персонажей и любимых животных. Количество, но не свойства каждого животного.

1 Ответ

0 голосов
/ 12 октября 2011

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