2012-01-08 13 views
0

データベースには本当にブール値でなければならないフィールドがありますが、何らかの理由で元の開発者がCHARを作成して「1」または「0 "Entity Framework ASP.NET MVCプライベートモデルのフィールド

私は、私は、私はそれをラップするために、私のモデルにプロパティを追加することができます考え出した私のモデルは、ブール型としてこのフィールドを表現したい
[Column("CHARGEABLE")] 
    [StringLength(1)] 
    private string Chargeable { get; set; } 

:私はちょうど(EditorForを表示

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

今私のビューにChargeableTrue)が、実際には更新されません。

私はそれが表示されていないにもかかわらず、モデルが更新されているときに、Viewから 'Chargeable'の値を取得しようとしていることが考えられます。入力フィールドがないので、nullになり、データベースに保存されます。

 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

+0

これは私がやったことです、そして、私は始めたよりも多くの問題を抱えています。 – NoPyGod

+0

"私のマッピングをどうやって作る?"モデルオブジェクトの各フィールドをビューモデルのフィールドで手動で更新することを意味しますか? – NoPyGod