2012-02-27 1 views
3

С помощью этой модели КонтактыASP.NET MVC3 модель связующий данные некорректны, когда геттер используется против коллекции

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 Телефон s. Данные:

  • [0] Primary = ложь, PhoneNumber = "111-111-1111", Type = "Бизнес" MVC3ModelBinderJsonTesting.Models.Phone
  • [1] Primary = верно, PhoneNumber = "111-111-1111", Type = "Бизнес" MVC3ModelBinderJsonTesting.Models.Phone
  • [2] Primary = ложь, PhoneNumber = "333-333-3333", Type = "Бизнес" MVC3ModelBinderJsonTesting.Models.Phone

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

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

ответ

3

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

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

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

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

+0

В то время как модельный вяжущий считает, что это честная игра, кажется, все работает нормально, если отправляемый объект PrimaryPhone соответствует данным для основного телефона в массиве Phones. Я не думаю, что свойство PrimaryPhone можно изменить на метод в этом случае, но это может быть и другим способом исправить. Спасибо за понимание! – kendaleiv

3

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

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

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

+0

Да, OP не должен быть POSTing PrimaryPhone, так как это производное свойство в любом случае и не имеет сеттера. –

+0

Это исправление, но я бы предпочел не редактировать данные ajax. Если я или кто-то еще забуду отредактировать данные перед отправкой на сервер, и это приведет к повреждению данных. – kendaleiv

+0

@RyanP Почему имеет значение, если я отправляю данные для свойства, у которого есть только геттер, разве вы не ожидаете, что связующее устройство будет игнорировать его, поскольку оно не имеет сеттера? – kendaleiv