2016-05-23 48 views
1

私はインターネットを精練していますが、まだ私が探しているものが見つかりませんでした(U2とは何ですか?)。それでは、私が探しているのは、キー/バリューデータベースに格納されている辞書にpoco(Lists、nullablesなどの複合語)を解析し、モデルを元に戻す手段を直観的に解析する方法です。本質的には、MVCモデルバインダーがフォームパラメーターからモデルにマップするときに何を達成しようとしていますが、逆も同様に行うことができます。私はソースを掘り下げようとしましたが、それはコントローラのすべての依存関係を必要とし、本当にそれを望んでいません。辞書のモデル<文字列、文字列>と戻る

P.S.:ここでは例として、いくつかのソースは、私が見えるように成果を希望するもの

public class Item 
{ 
    public string Name { get; set; } 
    public decimal? Amount { get; set; } 
    public List<RowItemModel> Items { get; set; } 
} 

public class RowItemModel 
{ 
    public string Description { get; set; } 
    public decimal Amount { get; set; } 
} 

だからここがモデルである、とされています注:私は、境界設定のためのプレフィックスをdb - > "Item"に追加しました。

Item.Name : The Name Here 
Item.Amount : 0.0 
Item.Items[0].Description : Description Here 
Item.Items[0].Amount : 50 
Item.Items[1].Description : Second Description 

あなたが見ることができるように(MVCを使用して)モデルへの結合のためのフォーム要素を作成する際に使用するよう、それはまったく同じ命名規則に従います。私が探しているのは、その辞書(辞書)からモデルにバインドして、読み込まれたモデルから辞書を生成するエレガントな方法です。

私はすでにいくつかの醜い弦の操作とその後の基本的な反射と再帰と組み合わせてこれを達成しましたが、それは私の口に悪い味を残しています。 /エレガントなソリューションをいただければ幸いです。

+0

これを達成する理由を説明できますか? [XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のようなものです。 –

+1

私の使用例は次のとおりです。フォームデータをデータベースに保存する必要があります。フォームは動的なものです(広告申込情報の行を動的に追加できる請求書フォームを想像してください)。私が扱わなければならないテーブル構造は、フラットなキー/値構造体なのでリレーショナルモデルなので、コントローラが受け取ったフォームパラメータと同じ形式でデータを保存することが最善の手段だと私は考えました。読み込みと編集のために逆を行う必要があります –

答えて

0

私は完全にあなたのユースケースを手に入れませんが、あなたが望むものがあなたのモデルを辞書に入れていれば、単純なシリアライズとデシリアライゼーションが役に立ちます。

var jss = new JavaScriptSerializer(); 
var str = jss.Serialize(myObj); 
var myDict = jss.Deserialize<Dictionary<string, object>(str); 

もちろん、最もパフォーマンスの高いものではありません。事実、あなたのケースを特別に扱うカスタムクラスを書くことができます。パフォーマンスのために、Json.NETのような別のシリアライザを使用してください。

+0

返信ありがとうございます。私は検索でこの解決策を見つけましたが、このオプションの問題(パフォーマンスは別として)は、必要なネストされたアイテムの正しいキーを生成しないということです。 (単にコレクション名のキーがあり、コレクション値としてjson文字列があります) –

+0

@ MarkRedfern javascriptシリアライザが生成する出力が不明です。あなたにもっと正確な 'Dictionary 'を与えるJson.NETを試してみてください – nawfal

関連する問題