【发布时间】:2012-03-07 02:18:42
【问题描述】:
我会很快解释我想要做什么。
我有一个可以编辑客户的页面。 Client 也有一组 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
因此,客户端有 3 个,而不是数据库中有 2 个 ClientContact,与现有 ClientContact 重复
请注意,我无法先为客户端清除数据库中的所有 ClientContact,因为其他表中存在与每个 ClientContact 相关的一堆数据。
如何更改我的编辑方法来解决这个问题?
编辑:我还应该提到,对于现有的 ClientContacts,ClientContactID 被传递给 viewModel.ClientContacts,如果是新联系人,则 ClientContactID 为 0。我想我可以检查一下每次迭代时 ClientContactID 是否为 0,但我不确定在那之后该去哪里
【问题讨论】:
-
你在使用 ORM 吗?请发布您的 SaveClient 方法的代码。
-
您的编辑是我要推荐的修复方法。如果它是 0 ,则仅将其添加到 client.ClientContacts 集合中。这有帮助吗?
-
我打算让他在 saveclient 之前查找并清理重复项 :)
标签: c# asp.net asp.net-mvc asp.net-mvc-3 entity-framework