我正在使用 MVC3、Razor、C#、.NET4、EF5。
我有很多直接编辑域模型的情况,是的,我意识到我应该使用 View Models :) 但是在短期内,我希望我能找到解决问题的方法,因为我得到了 null保存到数据库中,其中这些字段未在表单中指定为隐藏字段。我意识到这与模型绑定行为有关。
我的编辑操作:
public ActionResult Edit(int id)
{
StdOrg myOrg = db.StdOrg.Single(s => s.Id == id);
return View(myOrg);
}
假设我的视图上有 5 个字段:
Name
Address1
Address2
Address3
Address4
现在我的帖子编辑操作:
[HttpPost]
public ActionResult Edit(StdOrg myOrg)
{
if (ModelState.IsValid)
{
db.StdOrg.Attach(myOrg);
db.ObjectStateManager.ChangeObjectState(myOrg, EntityState.Modified);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(myOrg);
}
现在我的表记录中有 10 列,第 6-10 列有值。
Name
Address1
Address2
Address3
Address4
Terms
EmployeeNo
Code
Active
SetUpDate
当我保存表单时,第 6-10 列即条款等设置为空。现在我意识到这是因为我没有在我的视图中将它们指定为隐藏字段,因此 MVC 模型绑定假设这些为空。
有没有一种实用的方法来解决这个问题,而不是以出于安全原因我不想这样做的形式指定所有列。
提前谢谢了。
编辑
我的尝试似乎不起作用:
[HttpPost]
public ActionResult Edit([Bind(Include = "Id,Name,Name,Address1,Address2,Address3,Address4")] StdOrg myOrg)
心想……???
综上所述
对于那些感兴趣的人,我最终使用了“Value Injector”,这是另一个“Automapper”,我为它编写了一个简单的匹配例程来防止设置空值,同时也排除导航属性。非常有用的映射器。
仍然确实需要实现 ViewModel,因为它们似乎是识别视图中的哪些类属性的唯一方法,除非可以让 Bind 属性工作,而我不能。否则,即使使用映射器,也无法将 View 字段重置为 null,因为映射器将确保它被忽略!据我所知,它无法区分视图属性和域类中的其他属性。