3

私はOne次のプロパティで言うクラスを持っています

class One
{    
    public int Id {get; set;}
    public string Name {get; set;}
    public string Salary {get; set;}
    public string Designation {get; set;}    
}

One、ViewModelでこのようなタイプのリストを作成しました

public class OneViewModel
{
    public OneViewModel(){
        lstOne = new List<One>();
    }
    List<One> lstOne {get;set;}
    public int UserId {get;set;} 
}

ActionResult のリストにいくつかのオブジェクトを追加し、それをモデルに渡しました。

public ActionResult Index()
{
    OneViewModel model =  new OneViewModel();
    model.lstOne.Add(new One{Id=1,Name="Sam",Salary="5000", Designation="Manager" });
    model.lstOne.Add(new One{Id=2,Name="Akash",Salary="6000", Designation="Manager" });
    model.lstOne.Add(new One{Id=3,Name="Sid",Salary="7000", Designation="Manager" });

    return View(model);
}

post メソッドが呼び出されたときに、 で削除または追加されたlstOneオブジェクトと、 で特定のオブジェクトのどのプロパティが変更されたかを調べたいと思いますlstOne

[HttpPost]
public ActionResult Index(OneViewModel model)
{

   //what to do here, any ideas

}

リストを反復してオブジェクトとプロパティを比較するという古いアプローチを使用したくありません。他の方法はありますか。私はMSDNサイトを見ましたが、クエリを解決するためにそれを実装するための正しいアプローチを得ることができませんでしたObservableCollection.NotifyCollectionChangedEventArgs

4

2 に答える 2

0

わかりました、それを分析しましょう。

理想的な状況

  1. コレクションを取得するIndex()
  2. 修正するかどうか、コレクションに修正インジケータを設定する
  3. コレクションを入れるIndex(OneViewModel model)

ではIndex(OneViewModel model)、指標を分析して作業を行うことができます。すべて正常に動作します。

しかし、言葉は理想的ではなく、私は悪い男であり、私はあなたのアプリに害を与えたい. または、何かがうまくいかず、クライアントの動作が悪くなります。

悪い状況

  1. コレクションを取得するIndex()
  2. 変更するかどうか、およびコレクション内の変更インジケータを設定すると、問題が発生し、インジケータが設定されません。
  3. コレクションを入れるIndex(OneViewModel model)

ではIndex(OneViewModel model)、指標を分析できますが、指標が設定されていないため、変化を検出できません。

または、誰かがあなたのコレクションを使用するクライアントを作成し、インジケーターを設定する必要があることを知らず、それを行いません。または...他の多くの状況。

100%確実なものだけに頼ることができます。この場合、私がコメントで言っているように、呼び出しの間、コレクションはあなたのものではありません。何がどのように起こっていたのかを制御することはできません。

唯一の良い方法は比較です。

于 2016-04-21T11:32:51.450 に答える
0

これについてはよくわかりません。どこにも実装していません

ObservableCollectionの代わりに使用List

あなたのビューモデルには、このようなものがあります。

public class OneViewModel
 {
    public OneViewModel()
    {
     ObservableCollection<One> observableColleciton = new ObservableCollection<One>();
            observableColleciton.CollectionChanged += list_CollectionChanged;
    }

     public bool IsCollecitonDirty { get; set; }

    static void list_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        switch (e.Action)
        {
            case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
                isCollectionDirty = true;
                break;
            case System.Collections.Specialized.NotifyCollectionChangedAction.Move:
                break;
            case System.Collections.Specialized.NotifyCollectionChangedAction.Remove:
                isCollectionDirty = true;
                break;
            case System.Collections.Specialized.NotifyCollectionChangedAction.Replace:
                break;
            case System.Collections.Specialized.NotifyCollectionChangedAction.Reset:
                break;
            default:
                break;
        }
    }
}

あなたのモデルでは、これに似たことができます。

class One : INotifyPropertyChanged
{

    private int _id;

    public int Id
    {
        get { return _id; }
        set
        {
            _id = value;
            NotifyPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;


    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            IsModelDirty = true;
            // PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public bool IsModelDirty { get; set; }
}

IsCollectionDirtyコレクションが変更されたことを確認し、モデルが適切であることを確認するために使用します。

observableColleciton.Any(g=>g.IsModelDirty)
于 2016-04-21T11:09:14.070 に答える