我知道这是一个旧线程,但为了新读者的利益:
根据我使用 VS 2012、MVC 4 和 EF 4.0 的观察,其视图具有用于将表单提交回控制器的模型的 EF 对象。
在控制器上:
public ActionResult SubmitEFObject(tblData data, FormCollection col)
“数据”只会填充视图(@Html.xxxFor)中使用的属性。
似乎在创建“数据”时,发布的 FormCollection 用于设置数据的属性。如果您有一个未使用的属性,例如 DataID,则 data.DataID 将具有空值/默认值。将“@Html.Hidden(m => m.DataID)”添加到您的视图中,然后将填充 DataID。
作为一种“快速、肮脏”的处理方式,我创建了一个方法,将传入的“数据”与数据库中的“数据”合并并返回合并的对象:
// Note: error handling removed
public tblData MergeWithDB(DBContext db, tblData data, params string[] fields)
{
tblData d = db.tblData.Where(aa => aa.DataID == data.DataID).Single();
if (fields.Contains("Field1")) d.Field1 = data.Field1;
if (fields.Contains("Field2")) d.Field2 = data.Field2;
if (fields.Contains("Field3")) d.Field3 = data.Field3;
// etc...
return d;
}
在控制器上:
public ActionResult SubmitEFObject(tblData data, FormCollection col)
{
DataEntities db = new DataEntities();
tblData d = MergeWithDB(db, data, col.AllKeys);
db.SaveChanges();
}
您可以使用反射使其更通用,或者通过遍历 string[] 字段而不是所有 if 来提高效率,但出于我的目的,这“足够好”。