Данные связывателя модели ASP.NET MVC3 недопустимы, когда для коллекции используется метод получения - PullRequest
3 голосов
/ 27 февраля 2012

С этой моделью контакта

public class Contact
{
    public string Name { get; set; }
    public ICollection<Phone> Phones { get; set; }

    public Phone PrimaryPhone
    {
        get { return Phones.FirstOrDefault(x => x.Primary) ?? new Phone(); }
    }
}

public class Phone
{
    public bool Primary { get; set; }
    public string PhoneNumber { get; set; }
    public string Type { get; set; }
}

И с этим контроллером

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(Contact contact)
    {
        return View();
    }
}

Когда я POST к индексу HomeController, используя jQuery

(function ($) {
        var myData = {
            Name: 'Wesley Crusher',
            Phones: [
                { Primary: false, PhoneNumber: '111-111-1111', Type: 'Business' },
                { Primary: true,  PhoneNumber: '222-222-2222', Type: 'Personal' },
                { Primary: false, PhoneNumber: '333-333-3333', Type: 'Business' }
            ],
            PrimaryPhone: { Primary: true, PhoneNumber: '111-111-1111', Type: 'Business' }
        };

        $.ajax({
            url: '@Url.Action("Index", "Home")',
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify(myData)
        });
    })(jQuery)

связыватель модели неправильно создает телефоны ICollection. Данные:

  • [0] Primary = false, PhoneNumber = "111-111-1111", Type = "Business" MVC3ModelBinderJsonTesting.Models.Phone
  • [1] Primary = true, PhoneNumber = "111-111-1111", Type = "Business" MVC3ModelBinderJsonTesting.Models.Phone
  • [2] Primary = false, PhoneNumber ="333-333-3333", Type = "Business" MVC3ModelBinderJsonTesting.Models.Phone

Номер телефона "111-111-1111" повторяется, и типом является "Business" вместо«Личное». Это ожидаемое поведение по какой-то причине или это ошибка?

Я могу опубликовать пример проекта, если хотите, дайте мне знать.

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

Я думаю, это потому, что это не примитив.Это сложный объект, поэтому связыватель модели пытается установить его свойства.

Привязка модели лучше подходит для привязки к «моделям ввода», которые представляют входные данные, поступающие из формы.Как вы уже видели, вычисление свойств с помощью бизнес-логики для модели ввода может быть не лучшим подходом.

Возможно, это может быть метод расширения (к сожалению, нет поддержки свойств расширения), а не свойство вашего вводамодель.Или даже правильный метод.Наличие этого свойства заставляет связыватель модели думать, что это честная игра.

Если бы это был только примитивный тип, он не попытался бы установить его.

3 голосов
/ 27 февраля 2012

Я считаю, что сообщение PrimaryPhone вызывает проблему.Попробуйте удалить

PrimaryPhone: { Primary: true, PhoneNumber: '111-111-1111', Type: 'Business' }

Поскольку у этого свойства есть только геттер, и оно будет правильно определяться свойством Primary, оно все равно должно иметь действительные данные.

...