2012-01-08 38 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