我有一个名为Project的模型,它具有以下属性(为简洁起见而简化)。
[DataContract(IsReference = true)]
public class Project
{
[Key]
[DataMember]
public int id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public DateTime CreatedDate { get; set; }
}
该模型也是使用Entity Framework 4查询数据存储区的WCF服务的数据收集。模型的代码是从模板生成的,该模板根据实体框架模型自动生成CRUD服务层。
现在,我的MVC2应用程序有一个包含编辑字段的表单的视图。控制器Edit动作在POST时接受整个模型作为参数。
[HttpPost]
public ActionResult Edit(Project project)
{
var context = new ServiceContext();
try
{
if (ModelState.IsValid)
{
project = context.UpdateProject(project);
return RedirectToAction("Index");
}
}
catch
{
ModelState.AddModelError("", "Could not save project");
}
return View(project);
}
现在,我的问题是当表单发布到控制器时,Project模型的所有字段都正确填充除之外的'id'属性,默认为0。
我已经做了一些挖掘,并请求谷歌叔叔寻求答案,但我能得到的最接近的修复是将以下内容添加到模型的类中,
[Bind(Include="id")]
工作正常,但只填充'id'属性,这意味着我必须明确指定要包含在模型绑定中的每个属性。显然,这可能会变得令人讨厌,特别是因为模型本身具有许多以上的属性,而不是我上面显示的属性。
还有其他方法让这个工作吗?
直觉是[Key]属性与它有关,但我无法弄清楚。
表单有'id'属性的隐藏输入。
<%: Html.HiddenFor(model => model.id)%>
答案 0 :(得分:1)
尝试为ID添加其他隐藏字段,例如&lt;%:Html.HiddenFor(model =&gt; model.Id)%&gt;
答案 1 :(得分:0)
我想我找到了解决方案。
我的模型还有一些复杂的属性,它们映射到我的实体框架模型中的相关表。现在,由于我使用自跟踪实体T4模板来生成我的服务层,因此在将值映射到实体时,它有一些额外的逻辑。在这种情况下,复杂属性之一是名为Status的类,如下所示:
public class Status
{
public int ProjectId { get; set; }
public int StatusId { get; set ; }
}
ProjectId是我的数据存储区中Project表的外键。我注意到在模型绑定期间ProjectId字段也设置为0。
当我在视图中添加以下内容时
<%: Html.HiddenFor(model => model.Status.ProjectId) %>
这两个字段都有正确的值发布到控制器。
问题解决了:))
感谢 swapneel ,感谢您对此事的看法。