如何识别对象中哪些属性发生了变化<t>

时间:2016-04-21 10:49:05

标签: c# list asp.net-mvc-4 observablecollection inotifycollectionchanged

我的班级说One有以下属性

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

现在我在ViewModel中创建了一个类似One的列表

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网站上看到了ObservableCollectionNotifyCollectionChangedEventArgs,但是,为了解决我的问题,我无法获得正确的方法来实现它。

2 个答案:

答案 0 :(得分:0)

我对此不确定,我没有在任何地方实施

使用String n = JOptionPane.showInputDialog("Whats your name?") 代替ObservableCollection

在你的viewmodel中,你有类似的东西。

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

答案 1 :(得分:0)

好的,让我们分析一下。

理想情况

  1. Index(OneViewModel model)
  2. 获取馆藏
  3. 是否修改,并在集合中设置修改指标
  4. 将碰撞置于Index(OneViewModel model)
  5. Index()中,您可以分析指标并开展工作。一切正常。

    但是这个词并不理想而且我是坏人,我想伤害你的应用程序。或者出现问题,客户端工作不好。

    糟糕的情况

    1. Index(OneViewModel model)
    2. 获取馆藏
    3. 是否修改,设置集合中的修改指标 somethig出错并且指标未设置。
    4. 将碰撞置于Index(OneViewModel model)
    5. trigger updatecontactrolecount on Opportunity (before insert, before update) { Boolean isPrimary; Integer iCount; Map<String, Opportunity> oppty_con = new Map<String, Opportunity>();//check if the contact role is needed and add it to the oppty_con map for (Integer i = 0; i < Trigger.new.size(); i++) { oppty_con.put(Trigger.new[i].id, Trigger.new[i]); } isPrimary = False; for (List oppcntctrle :[select OpportunityId from OpportunityContactRole where (OpportunityContactRole.IsPrimary = True and OpportunityContactRole.OpportunityId in :oppty_con.keySet())]) { if (oppcntctrle .Size() >0) { isPrimary = True; } } iCount = 0; for (List oppcntctrle2 : [select OpportunityId from OpportunityContactRole where (OpportunityContactRole.OpportunityId in :oppty_con.keySet())])//Query for Contact Roles { if (oppcntctrle2 .Size()>0) { iCount= oppcntctrle2 .Size(); } } for (Opportunity Oppty : system.trigger.new) //Check if roles exist in the map or contact role isn't required { Oppty.Number_of_Contacts_Roles_Assigned__c = iCount; Oppty.Primary_Contact_Assigned__c =isPrimary; } } 中,您可以分析指标,但由于未设置指标,您无法检测到更改。

      或者某人使用您的收藏品来创建客户并且他不知道他必须设置指标而他不会这样做。或者......许多其他情况。

      你可以只依靠100%肯定的东西。在这种情况下,正如我在评论中所说,在调用之间,集合不属于您。你无法控制它发生了什么以及如何发生。

      唯一的好方法是比较。