C# 使用MVC3中的ViewModels处理更新和删除
在MVC中如何最好地处理列表的更新和删除的概念上,我似乎遇到了一些问题。我将试着用一个简短的例子来解释我的问题。从实体框架中,我有我的对象位置: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
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,而是购物车位置的更新和删除。谢谢,这似乎是一个很好的解决方案,我会尽快尝试=)