2012-01-04 10 views
1

次の問題があります。単一のエンティティフレームワークオブジェクトを辞書に変換する

  • 名:表示さ
  • 私はいくつかのフィールドは、例えば示さするかしないかどうかを定義するデータベース内の設定を持っている

    class Company{ 
        public string Name {get; set}; 
        public string Address {get; set}; 
        public string Email{get; set}; 
        public string WebSite {get; set}; 
    } 
    

    :私は、性質などを持つエンティティフレームワークモデルのクラスを持っています

  • 住所:
  • メールを表示:
  • ウェブサイトを非表示:非表示

これは動的で、すべてのフィールドは名前で参照されます。

オブジェクトを表示するとき。何らかの形で、あるオブジェクトを何らかの辞書に変換して、キーがプロパティ名になり、値がプロパティ値になるように変換するとよいでしょう。そうすれば、表示する必要があるかどうか(すべてのフィールドで、例えば:

CompanyDetails.cshtml

<h2>Company Details</h2> 
@foreach(var property in modelDictionary.Keys){ 

    @if(IsVisible(property)) 
     @Html.Raw(modelDictionary[property]) 
} 

プロパティの辞書に、エンティティフレームワークモデルから単一のオブジェクトを変換するための最良の方法は何ですか?コントローラーアクションでそれをオブジェクトから辞書に変換するか、またはモデルのメタデータを何らかの形でビューで使用する必要がありますか?

私はCompanyクラスでリフレクションを使用してクラス内のすべてのプロパティを見つけることができるので、辞書に入れることができますが、これは古すぎる学校のソリューションのように見えます。

おかげ

+0

私は」あなたが達成しようとしていることとその理由を混乱させます。ビューに特定のフィールドを表示しないでください。または、表示可能かどうかを判断する属性をモデルフィールドに追加します(しかし、私の最初の提案はより簡単/より理にかなっています)。 – JasCav

+0

次のような条件を繰り返すことを避けたい:@if(IsVisible( "Name"))

@Html.Raw(model.Name)
@if(IsVisible( "Address"))
@Html.Raw(model.Address)
など同じものに囲まれたフィールドがたくさんあるとします条件の場合。モデルでは、私はc = companies.Where(company => company.ID == parID)のようなものを使ってすべてのフィールドを返します。私は単一のforeachループで列名を持つセルを参照しているDataSetで同様の以前のコードを持っていました。それはDataSetでしたが、それはエレガントなソリューションだったので、私はここで同様のことをしたいと思います。 –

答えて

2

@model RouteValueDictionary 

<h2>Company Details</h2> 
@foreach (var item in Model) 
{ 
    if (IsVisible(item.Key)) 
    { 
     <div>@item.Value</div> 
    } 
} 
1

あなたのエンティティのインデクサを実装し、エンティティのプロパティのいずれかにそのトラフ反射をマッピングすることができます。

のようなもの:

public class Company 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public string Email { get; set; } 
    public string WebSite { get; set; } 
} 

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new Company 
     { 
      Address = "some address", 
      Email = "some email", 
      Name = "some name", 
      WebSite = "some website" 
     }; 
     return View(new RouteValueDictionary(model)); 
    } 
} 

とビューで:あなたは辞書にオブジェクトを変換することができますRouteValueDictionaryを使用することができ

class Entity 
{ 
    public bool this[int index] 
    { 
     get 
     { 
      // Select all properties, order by name and return the property index 
     } 
    } 

    public bool this[string name] 
    { 
     get 
     { 
      // Select all properties and return the correct one. 
     } 
    } 
} 
関連する問題