2013-03-03 146 views
0

我有一个模型类填补缺失的领域,只有修改某些字段和“的SaveChanges”使用默认值

public class MyModel 
{ 
    public int A { get; set; } 
    public int B { get; set; } 
    public int C { get; set; } 
    public DateTime D { get; set; } 
} 

在编辑画面,我只需要编辑`A和B.而下面的意志用默认值(0和'0001-01-01')覆盖C和D如何保留C和D中存在的值(在数据库表中)除了包含在视图中并将它们隐藏起来?

[HttpPost] 
public ActionResult Edit(MyModel myModel) 
{ 
    if (ModelState.IsValid) 
    { 
     _db_Entry(myModel).State = EntityState.Modified; 
     _db.SaveChanges(); 
    } 
    return View(myModel); 
} 

回答

0

制作具有A和B属性的视图模型。

public class ViewModel 
{ 
    public int A {get;set;} 
    public int B {get;set;} 
} 

然后将其作为您控制器中的参数,然后将其映射到您的模型类。

+0

所以我仍然需要映射视图模型为'数据库模型类之后,从已有的记录回填'C'和'D'。 SaveChanges'? – ca9163d9 2013-03-03 10:51:02

1

我不知道你的模型应该有的样子,但在你的控制,我通常这样做:

[HttpPost] 
public ActionResult Edit(MyModel myModel) 
{ 
    if (ModelState.IsValid) 
    { 
     var existEntry = _db.YourEntity.firstOrDefault(o => A == o.A); 
     if(existEntry != null){ 
      existEntry.A = myModel.A; 
      existEntry.B = myModel.B; 
      _db.SaveChanges(); 
     }   
    } 
    return View(myModel); 
} 

当然,这实际上取决于你的模型细节,以获得现有的条目,也许你不喜欢这种方法,在这种情况下,其他答案可能更适合你的需求。

编辑:基本上,我通常处理这个问题的方式是从数据库中获取现有对象,更新并提交更改,从而仅更新您关心的属性并将其余部分保留原样。

+0

我想在数据库表中保留C,D的原始值。 – ca9163d9 2013-03-03 03:48:08

+0

啊,我明白了。我误解了。好吧。让我编辑我的答案,我会做什么,你可以拿走它或离开它! – 2013-03-03 03:49:24

+0

“编辑”操作不应该添加记录。 – ca9163d9 2013-03-03 05:40:27

0

您可以使用UpdateModel(或TryUpdateModel)。它更新现有实体,但仅限于它可以在值提供程序中找到的属性;其他财产保持不变。

您通常使用它像这样:

[HttpPost] 
public ActionResult Edit(int id, TModel model, string returnUrl) 
{ 
    // Invalid model; redisplay view 
    if (!ModelState.IsValid) return View(); 

    var entity = db.Entity.Find(id); 

    // Entity not found; return 404 
    if (entity == null) return HttpNotFound(); 

    // Everything OK; update entity and redirect back 
    UpdateModel(entity); 
    db.SaveChanges(); 
    return Redirect(returnUrl); 
} 
+0

参数'model'具有'TModel'的所有成员,因为它的类型是'TModel'。例如,视图中不存在的'TModel'的'DateTime'属性将填充'0001-01-01'的值(我试图在Visual Studio中“快速观看”)。奇怪的是,UpdateModel()如何知道viwe中是否存在一个属性? – ca9163d9 2013-03-03 10:29:39

+0

我不确定我在追随。在这种情况下,TModel是视图模型类型,所以它只有那些你想编辑的属性。它不一定必须拥有实体模型的所有属性。 UpdateModel不知道视图中存在哪些属性,但它确实知道它在值提供程序中找到的属性。 – 2013-03-04 04:09:18

+0

换句话说,使用您自己的示例,您的EF实体具有所有属性,A,B,C和D. TModel只有A和B. – 2013-03-04 04:25:01