使用MVC3中的ViewModel处理更新和删除

时间:2012-03-21 07:06:36

标签: c# asp.net-mvc-3 concurrency viewmodel

我似乎遇到了一些问题,围绕如何最好地处理MVC中的列表更新和删除的概念。我将用一个简短的例子来解释我的问题。从实体框架我有我的对象位置:

public int Quantity { get; set; }

public int PositionNumber { get; set; }

public string ArticleNumber { get; set; }

public string Name { get; set; }

public string Remark { get; set; }

现在我听说最好使用已使用的属性创建一个ViewModel foreach View,这样可以使ViewModel看起来很简单。在控制器中,我们通过将Model映射到ViewModel来向视图返回Positions列表。 现在,视图显示用户可以更改的数量和备注的文本框。他也可以删除一个职位。 现在,在发布用户输入的数据时,我会执行以下操作:

[HttpPost]
    public ActionResult Index(IEnumerable<ShoppingCartPositionModel> shoppingCartPositions)
    {
        var positions = _shoppingCartManager.GetActiveShoppingCart().Positions.Values.OrderBy(p => p.PositionNumber).ToList();

        if (FormCollection.AllKeys.Any(k => k.Contains("Remove")))
        {
            string key = FormCollection.AllKeys.Where(k => k.Contains("Remove")).First();
            int start = key.LastIndexOf('[') + 1;
            int end = key.LastIndexOf(']');
            int difference = end - start;

            int index;
            if (int.TryParse(key.Substring(start, difference), out index))
            {
                _shoppingCartManager.DeleteShoppingCartPosition(positions.ElementAt(index));
            }
        }
        else
        {
            if (ModelState.IsValid)
            {

                for (int i = 0; i < positions.Count(); i++)
                {
                    var position = positions.ElementAt(i);
                    var cartPosition = shoppingCartPositions.ElementAt(i);

                    position.PositionNumber = cartPosition.PositionNumber;
                    position.Quantity = cartPosition.Quantity;
                    position.Remark = cartPosition.Remark;
                }

                _shoppingCartManager.UpdateShoppingCartPositions(positions);
            }
        }

        var cartPositions = GetShoppingCartPositionsModel();
        UpdateModel(cartPositions);

        return View(cartPositions.ToList());
    }

我的问题是,如果在此期间另一位用户删除了某个对象,或者甚至在其他用户之间添加了新位置,这将是如何工作的?是否最好在视图上制作隐藏字段并按地图制作?并且为了检测更新,保存更改的日期并在视图上显示隐藏的字段以用于该状态?因为我认为如果我只是像这样检查日期更新,我将始终拥有最新的更新日期,我不认为服务需要在几秒钟内更新项目,任何其他用户都可以更改数据。 我希望这能解释我的问题,并感谢那些试图帮助我找到办法的人。

1 个答案:

答案 0 :(得分:0)

您似乎遇到的第一个问题是您在同一表单上有不同的操作。如果您可以通过不同的操作处理删除和更新的提交按钮,这会有帮助吗?有一个很好的解决方案about this here

另一点是在此期间检测其他用户可能发生的变化。视图上的隐藏字段与整个数据结构的最后更新时间有何关系?如果它在回发时仍然相同,则没有人触及数据。