2013-03-03 144 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