Редактирование связанной коллекции объекта при редактировании объекта - PullRequest
1 голос
/ 15 февраля 2012

Я объясню, что я пытаюсь сделать очень быстро.

У меня есть страница, где я могу редактировать клиентов.Клиент также имеет коллекцию ClientContacts, связанную через внешний ключ в базе данных.При редактировании клиента вы также можете добавить / отредактировать все ClientContacts на той же странице.

Вот мои модели просмотра:

public class ClientViewModel
{
    [ScaffoldColumn(false)]
    public int ClientId { get; set; }

    [DisplayName("Name")]
    public string Name { get; set; }

    [DisplayName("Contacts")]
    public List<ClientContactViewModel> ClientContacts { get; set; }       
}

public class ClientContactViewModel
{
    [ScaffoldColumn(false)]
    public int ClientContactId { get; set; }

    [DisplayName("Client")]
    public int ClientId { get; set; }

    [Required(ErrorMessage = "Name is required")]
    [StringLength(100, ErrorMessage = "Name must be 100 characters or less")]
    [DisplayName("Name")]
    public string Name { get; set; }
}

И мой метод контроллера для редактирования клиента:

[HttpPost]
public ActionResult Edit(ClientViewModel viewModel)
{
    // get client
    Client client = _clientsRepository.GetClient(viewModel.ClientId);
    client.Name = viewModel.Name;

    if (ModelState.IsValid)
    {
        // save client contacts
        if (viewModel.ClientContacts != null)
            foreach (var clientContact in viewModel.ClientContacts)
                client.ClientContacts.Add(new ClientContact
                {
                    ClientID = client.ClientID,
                    Name = clientContact.Name
                });

        _clientsRepository.SaveClient(client);

        return RedirectToAction("Index");
    }

    return View(viewModel);     // validation error, so redisplay same view
}

Моя проблема в следующем: скажите, что у этого редактируемого клиента уже есть ClientContact - ID: 1, Name: Client1.Если я отредактирую этого Клиента, добавлю еще один ClientContact и затем сохраню свой Клиент, он не редактирует существующий ClientContact, он добавляет его вместе с новым ClientContact, поэтому я получаю:

ID: 1, Name: Client1
ID: 2, Name: Client1
ID: 3, Name: Client2

Поэтому вместо2 ClientContacts в базе данных, клиент имеет 3, с дубликатом существующего ClientContact

Обратите внимание, что я не могу сначала очистить все ClientContacts в базе данных для клиента, так как есть куча данныхв других таблицах, относящихся к каждому ClientContact.

Как я могу изменить свой метод Edit, чтобы исправить это?

EDIT: Я должен также упомянуть, что ClientContactID передается вviewModel.ClientContacts для существующих ClientContacts, и ClientContactID равен 0, если это новый контакт.Я предполагаю, что могу сделать проверку, чтобы видеть, равен ли ClientContactID 0 на каждой итерации, но я не уверен, куда идти с этим после этого

1 Ответ

1 голос
/ 15 февраля 2012

хорошо, так что я надеюсь, что я правильно понимаюВы добавляете все клиентские контакты в список ClientContacts при редактировании, а затем вызываете SaveClient (), так что ваш код выше создает дублирующую проблему.

Вот проблема по существу:

foreach (var clientContact in viewModel.ClientContacts)
                client.ClientContacts.Add(new ClientContact

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

Если контакт клиента уже существует в базе данных, он, скорее всего, имеет свойство clientcontactid, которое вы можете проверить, и оно будет больше 0.

что-то вроде

foreach(ClientContact clientContact in viewModel.ClientContacts)
{
  if (clientContact.ClientContactId ==0)
      //add it to the collection here
}

- это то, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...