gpt4 book ai didi

asp.net-mvc - MVC 3 Master/Detail UpdateModel 插入新的详细记录而不是更新现有记录

转载 作者:行者123 更新时间:2023-12-04 20:06:01 25 4
gpt4 key购买 nike

好的,我读过 Phil Haack 的 article在绑定(bind)到列表时,我在一个 View 上可以正常工作。但是当我从主记录中做这件事时,我被卡住了。

我有这个对象的一个​​非常简单的表格

public class Master
{
public int ID { get; set; }
public string MasterTitle { get; set; }
public virtual IList<Detail> Details { get; set; }
}

public class Detail
{
public int ID { get; set; }
public string DetailName { get; set; }
public virtual Master Master { get; set; }
}

表单集合带有预期的前缀:
    [0] ""  
[1] "ID"
[2] "MasterTitle"
[3] "Details[0].ID"
[4] "Details[0]"
[5] "Details"
[6] "Details[0].DetailName"
[7] "Details[1].ID"
[8] "Details[1]"
[9] "Details[1].DetailName" string

并且 Controller.UpdateModel(master) 正确绑定(bind)了所有属性。但是当我调用 dbContext.SaveChanges 时,它会从 sql profiler 发出以下 sql(伪代码)
update detail1 set masterID = null
update detail2 set masterID = null
update master set masterName = 'newname'
insert detail1 ...
insert detail2 ...

我有一个可行的解决方法,但它非常hackish,我目前没有匹配 key ,所以它依赖于以正确顺序返回的所有内容。另外,我必须包含我想要更新的所有字段。
    public ActionResult Edit(FormCollection collection)
{
try
{
using (var ctx = new PlayContext())
{
var id = int.Parse(collection["ID"]);
Master master = ctx.Master.Find(id);

UpdateModel(master, new [] {"MasterTitle"});
for (int i = 0; i < master.details.Count; i++)
{
UpdateModel(master.details[i], "Details[" + i + "]", new[] { "DetailName" });
}

ctx.SaveChanges();
return View(master);
}
}
catch (Exception e)
{
ModelState.AddModelError("", e);
}
return View();
}

我有一种感觉,UpdateModel 以某种方式删除并重新添加了 child 。

有没有其他人让这个工作?当然,我可以认输并自己解析索引字段名称,但我已经很接近了!

最佳答案

它应该可以工作 - 我在 MVC2 中的类似代码没有任何问题。

不过,我很担心这条线:
[5] 《详情》

它发回的详细信息是什么?我预计这可能会导致问题 - 不完全确定模型绑定(bind)器在 MVC 3 中是如何工作的,但我希望这一行会导致它将 Details 集合设置为 NULL。

您不必依赖以特定顺序返回的字段 - 活页夹将被设计为以任何顺序处理它们。

关于asp.net-mvc - MVC 3 Master/Detail UpdateModel 插入新的详细记录而不是更新现有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4915962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com