2012-01-08 42 views
0

數據庫中有一個字段確實應該是布爾值,但由於某種原因,原始開發人員將其設置爲CHAR,該字符將設置爲「1」或「0 」。實體框架ASP.NET MVC私有模型字段

[Column("CHARGEABLE")] 
    [StringLength(1)] 
    private string Chargeable { get; set; } 

我希望我的模型來表示這個字段作爲一個布爾值,所以我想我可以將屬性添加到我的模型把它包起來:

[NotMapped] 
    public bool ChargeableTrue 
    { 
     get 
     { 
      return Chargeable == "1" ? true : false; 
     } 
     set 
     { 
      Chargeable = value ? "1" : "0"; 
     } 
    } 

現在在我查看我只是顯示EditorFor( ChargeableTrue),但是當我點擊保存時,它實際上並沒有更新它。

我認爲正在發生的事情是,當模型正在更新時,它仍然試圖從視圖中獲取'Chargeable'的值,儘管我沒有在那裏顯示它。由於沒有輸入字段,它只會變爲空,並最終將其保存到數據庫。

 if (ModelState.IsValid) 
     { 
      db.Entry(call).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

在這種情況下預計會做什麼?

回答

2

根據KMan的回答,以下是擴展版本,以防您不熟悉創建視圖模型。

這個想法是,你的域對象並不是真的想從你的視圖中完全更新。相反,您可以創建一個可以包含視圖特定項目的中介(如要填充下拉列表的對象列表)。現在

public class MyViewModel { 
    public bool Chargeable { get; set; } 
} 

,你可以這樣做:

@* In view *@ 
Html.EditorFor(m => m.Chargeable) 

// In controller 
public ActionResult Save(MyViewModel model) { 
    if (ModelState.IsValid) { 
     var domainObject = new MyObject() { 
      Chargeable = model.Chargeable ? "1" : "0" 
     }; 

     // the rest of your code using domainObject 
    } 
} 

我會考慮剛創建接受您的視圖模型,以保持映射在一個地方你的域對象的構造函數的重載。我通常使用像AutoMapper這樣的工具來映射對象或手動擴展方法。

視圖模型通常包含您的域對象的屬性的子集,但可以包含它們的所有屬性或像列表,可見性狀態等更多屬性。它們有着令人難以置信的有用性,我從來沒有做過MVC項目我沒有使用過它們。

2

使用視圖模型並在控制器上進行映射。

+0

這就是當你的域名不符合你想要的視圖時所要做的。 +1 – kamranicus 2012-01-08 21:47:54

+0

這就是我最終做的,現在我有更多的問題比我開始。 – NoPyGod 2012-01-09 04:02:34

+0

如何「製作我的貼圖」?你的意思是用視圖模型中的字段手動更新模型對象的每個字段? – NoPyGod 2012-01-09 04:13:46