新创建的实体的ID未写入视图

时间:2011-09-22 14:20:48

标签: asp.net-mvc asp.net-mvc-3

我的行动基本上是这样做的:

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而不是而不仅仅是更新它。

有人可以建议为什么没有填充隐藏字段吗?

2 个答案:

答案 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);