我正在asp.net mvc的拍卖网站上工作。我在ItemsController中有一个方法,它将一个item对象复制为一个新的列表。我目前的代码如下:
public ActionResult Copy(Guid id)
{
Item item = db.Items.Find(id);
Cat cat = db.Cats.Find(item.CatId);
Item copy = new Item(Guid.NewGuid(), item.ItemName + " copy",
item.ItemDesc, item.ModelNo, item.RetailValue, item.ImageFileName,
item.StartDate, item.EndDate, item.InitialBid, item.IncrementBy,
null, null, null, cat);
db.Items.Add(copy);
db.SaveChanges();
return RedirectToAction("Index", "Items", new {catId = item.CatId});
}
现在,我正在追加"拷贝"每一份副本。相反,我想做的是例如:" Item"然后第一个副本将是"项目(1)"如果他们要复制" Item"再次,名称将是"项目(2)"等。
修改
我现在在下面的答案中发布了一个新的(在下面的评论中更新了错误)功能方法。
如果有人看到代码改进或更有效的方法来完成同样的事情,请告诉我。
答案 0 :(得分:0)
public ActionResult Copy(Guid id)
{
Item item = db.Items.Find(id);
Cat cat = db.Cats.Find(item.CatId);
int newCopyValue = 0;
string newName;
List<Item> items = db.Items.Where(i => i.ItemName.Contains(item.ItemName)).OrderBy(i => i.ItemName.Length).ThenBy(i => i.ItemName).ToList();
if (items.Count == 1)
{
newName = item.ItemName + " (1)";
}
else
{
Item lastCopy = items.ElementAt(items.Count - 1);
String copyName = lastCopy.ItemName;
if (copyName[copyName.Length - 3] == '(' && copyName[copyName.Length - 1] == ')')
{
newCopyValue = Convert.ToInt32(copyName[copyName.Length - 2].ToString()) + 1;
}
else if (copyName[copyName.Length - 4] == '(' && copyName[copyName.Length - 1] == ')')
{
string doubleDig = copyName[copyName.Length - 3].ToString() + copyName[copyName.Length - 2].ToString();
newCopyValue = Convert.ToInt32(doubleDig) + 1;
}
newName = item.ItemName + " (" + newCopyValue.ToString() + ")";
}
Item copy = new Item(Guid.NewGuid(), newName, item.ItemDesc, item.ModelNo, item.RetailValue, item.ImageFileName, item.StartDate, item.EndDate, item.InitialBid, item.IncrementBy, null, null, null, cat);
db.Items.Add(copy);
db.SaveChanges();
return RedirectToAction("Index", "Items", new {catId = item.CatId});
}
带有两位数的新功能方法,支持名称中的括号。仍然会遇到“Wood Clock”和“Clock”的问题。