我的行动基本上是这样做的:
public ViewResult Save(Foo postedFoo)
{
Foo foo;
if (postedFoo.Id == 0) //New foo; need to save for first time
{
foo = new Foo();
}
else //Already exists, need to load and update
{
foo = FooRepository.LoadFoo(postedFoo.Id);
}
UpdateModel(foo);
FooRepository.Save(foo);
return View(foo);
}
如您所见,该操作处理创建新Foo
实例和更新现有实例。
Foo的Id属性被写入视图中的隐藏字段,如下所示:
@Html.HiddenFor(m => m.Id)
问题是,在用户保存新Foo
的情况下,Foo
的{{1}}属性(在Id
行中设置)在将页面重新显示给用户之前,不会将其写入隐藏字段。
这意味着如果用户保存新的FooRepository.Save(foo)
,然后立即更改某些内容并再次保存,控制器认为它是另一个新Foo
并在数据库中创建新的Foo
而不是而不仅仅是更新它。
有人可以建议为什么没有填充隐藏字段吗?
答案 0 :(得分:2)
写
ModelState.Remove("Id")
返回View();
这种行为是由于ModelState
是呈现时值的主要供应商(是的,而不是Model
本身)。因此,从ModelState
删除ID会使编辑使用Model
的值(在您的情况下,更新为Id
)
答案 1 :(得分:0)
不应该else
行读
foo = FooRepository.LoadFoo(postedFoo.Id);
此外,new Foo();
并未将ID
的值设置为任何位置,除非您已将其硬编码到模型中。
但如果FooRepository.Save(foo)
意味着这样做,那就不是。您需要将ID
字段返回给控制器。
foo = FooRepository.Save(foo);