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 网站上看到ObservableCollectionNotifyCollectionChangedEventArgs找到了正确的方法来实现它以解决我的查询。

4

2 回答 2

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 回答
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 回答