Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MVC3中的ViewModels处理更新和删除_C#_Asp.net Mvc 3_Concurrency_Viewmodel - Fatal编程技术网

C# 使用MVC3中的ViewModels处理更新和删除

C# 使用MVC3中的ViewModels处理更新和删除,c#,asp.net-mvc-3,concurrency,viewmodel,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 { g

在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,这样可以简化ViewModel的外观。在控制器中,我们通过将模型映射到ViewModel,将位置列表返回到视图。 现在,视图显示用户可以更改的数量和备注的文本框。他还可以删除一个职位。 现在,当发布用户输入的数据时,我会这样做:

[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());
    }
[HttpPost]
公共行动结果索引(IEnumerable 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差=结束-开始;
整数指数;
if(int.TryParse(key.Substring(start,difference),out index))
{
_shoppingCartManager.DeleteShoppingCartPosition(positions.ElementAt(index));
}
}
其他的
{
if(ModelState.IsValid)
{
对于(int i=0;i
我的问题是,如果同时另一个用户删除了一个对象,或者甚至在其他用户之间添加了一个新位置,那么这将如何工作?最好在视图上创建一个隐藏字段,并以此作为地图?若要检测更新,请保存更改的日期,并在视图上显示隐藏字段?因为我认为如果我像这样简单地检查日期更新,我将始终拥有最新的更新日期,并且我不认为服务需要在几秒钟内更新项目,任何其他用户都可以更改数据。
我希望这能解释我的问题,并感谢那些试图帮助我找到方法的人。

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


另一点是同时检测其他用户可能进行的更改。视图上的隐藏字段以及整个数据结构的上次更新时间如何?如果回发时仍然相同,则表示没有人接触过数据。

为什么要在表单中进行回发以删除实体?你不能仅仅使用一个不同的操作(比如购物车/删除/id)。然后,您可以处理其他用户已在此操作中删除该项目的情况。您是指链接吗?问题是整个购物车要么更新(数量等),要么删除单个项目。如果可能的话,我不想在表单中创建一个表单来调用不同的post操作。是的,这是我的意图。我认为你不能做嵌套表单。最好的方法是在JavaScript可用的情况下调用AJAX。但在你的情况下,这会变得有点复杂。该链接也不起作用,因为如果你不发回,用户会失去他的更改。还在想。。。同时:尽量简化你的问题,你可能会得到更多的关注。主要问题不是ViewModel,而是购物车位置的更新和删除。谢谢,这似乎是一个很好的解决方案,我会尽快尝试=)