2017-04-03 16 views
1

ユーザーがクリックは、MVCサーバ側(C#の)上JSON - C#のオブジェクトにデシリアライズ

tasks  : { 
     updated : [ 
      { Id : 123, SomeField1 : 'new value', SomeField2 : 'new value', SomeField3 : 'new value' }, 
      { Id : 125, SomeField2 : 'new value' }, 
      { Id : 127, SomeField1 : 'new value', SomeField4 : 'new value' }, 
      { Id : 129, SomeField2 : 'new value', SomeField3 : 'new value' }, 
      { ................ } 
     ], 
     removed : [ 
      { Id : 345 }, 
      { Id : 847 } 
     ] 
    } 

を保存するときに、私は、次のJSONを持って、私はViewModelにと.NETは私のviewmodelにこのバックをデシリアライズ持っていますオブジェクト。この例では ですが、このオブジェクトにはId、SomeField1、SomeField2、SomeField3、SomeField4があります。

私が抱えている問題は、クライアントが実際に更新されたフィールドのみを送信するということです。ユーザーがSomeField3を更新しなかった場合は、jsonになくなり、その配列オブジェクトの.NETはSomeeField3としてnullになります。

私はレコードを取得しないで、viewmodelのすべてのフィールドを更新し、SomeField3をnullに設定するときに更新を呼び出します。これは正しいものではありません。 (別のケースでは、テキストが削除され、更新が有効になる可能性があります。

この問題に取り組む最も良い方法は何かわかりません。 あなたの提案を楽しみにしています。

+0

中に処理されますか? – Komal

+0

はい、EF(コードファースト)とUnitOfWork。 – Cranzy

+0

db.Entry(sometable).Property(x => x.somefield).IsModified = trueのように、更新されたフィールドのみをdbで変更するには、.IsModifiedプロパティを使用できます。サーバー側の – Komal

答えて

0

私はあなたがAPIアクションで更新された文字列を投稿することをお勧め、あなたはとあなたのソリューションを取得することができます: ダイナミックプロパティマッピング機能を作成します。

public static class DynamicToStatic 
    { 
    public static T ToStatic<T>(object source, T destination) 
    { 
     var entity = destination; 

     //source implements dictionary 
     var properties = source as IDictionary<string, object>; 

     if (properties == null) 
      return entity; 

     foreach (var entry in properties) 
     { 
      var propertyInfo = entity.GetType().GetProperty(entry.Key); 
      if (propertyInfo != null && entry.Value != null)//Check property and its values exist or not ,change only when source contains value 
       propertyInfo.SetValue(entity, entry.Value, null); 
     } 
     return entity; 
    } 
} 

はリクエストのJSONは、動的オブジェクトに変換し、その後に動的オブジェクトをマップあなたの静的なクラス型のモデル、あなたの必要に応じて、あなたのdbレコードまたは任意のソースから初期化されたクラス型モデル。

//updatedJsonObjectString bound from request post data(JSONSTRINGIFY of post data) 
dynamic source = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(updatedJsonObjectString); 
Class1 model = new Class1();//mapped/filled by data call 
var retUser = DynamicToStatic.ToStatic<Class1>(source, model); 
+0

こんにちは このクライアントツールにより送信されるJSON、追加、更新、および1つのJSONリクエスト(私はこれを変更できることを確認していない)で、すべてを削除します。..だから私は、オブジェクトを持っている パブリッククラスSchedulerHelperSaveObject { 公共のIEnumerable を追加します{ 取得する;セット; } public IEnumerable updated {get;セット; } public IEnumerable removed {get;セット; } } 私のviewmodelは、このビューのタスクを使用していますか、または何らかのIM処理を使用しています。私はすべての作業を削除して削除しました。 – Cranzy

+0

上記と同じ方法で、DynamicToStatic.ToStatic()実装でロジックを設定できます。 –

+0

これを確認してくださいhttp://stackoverflow.com/a/5235927/1365663 –

0

あなたはデシリアライズのためNewton Jsonを使用している場合。 Newton Json DeserializeObjectメソッドは、パラメータとしてjson stringJsonSerializerSettingsをとるオーバーロードを持っています。 JsonSerializerSettingsはNullValueHandlingMissingMemberHandlingのプロパティを持ちます。

  • MissingMemberHandling:取得またはどの欠落メンバーセットは、(例えば、JSONオブジェクトにメンバーではないプロパティを含む)デシリアライゼーション中 を取り扱われます。

  • NullValueHandlingは:取得または設定はどのようにnull値レコードを保存するためのEFを使用しているシリアライズとデシリアライズ

関連する問題