我有一个MVC5 Code First EF6应用程序,其中包含以下模型(为了这个问题而简化)
public class AllocationHeader : IObjectWithState
{
private ICollection<AllocationLabourLine> _Labour { get; set; }
public AllocationHeader()
{
_Labour = new List<AllocationLabourLine>();
}
public virtual ICollection<AllocationLabourLine> Labour
{
get { return _Labour; }
set { _Labour = value; }
}
}
public class AllocationLabourLine : IObjectWithState {}
每个AllocationHeader都有多个AllocationLabourLines ...我删除了所有其他属性,因为我认为它们与问题无关。
在我的创建页面上,我创建了一个具有预定义数量的AllocationLabourLines的AllocaitonHeader,并将模型返回到视图。
public ActionResult Create()
{
var allocation = new AllocationHeader() { AllocationDate = DateTime.Now.Date };
for (int i = 0; i < 11; i++)
{
allocation.Labour.Add(new AllocationLabourLine());
}
GetJobs(null);
return View(allocation);
}
当模型被回发时,我处理分配中的Labor条目并尝试删除任何不包含EmployName的预生成条目,这些是未使用的。
// validate labour
var labourDel = new List<AllocationLabourLine>();
foreach (var l in entity.Labour)
{
if (string.IsNullOrEmpty(l.EmployeeName))
{
// set entity to be removed as we cannot remove from collection during the foreach
labourDel.Add(l);
}
}
// remove items from collection
labourDel.ForEach(l => entity.Labour.Remove(l));
如果ModelState中存在错误,我们必须将更新的模型返回到页面,则使用了错误的值。
所以,如果这是数据条目
命名
现在返回的数据如下所示,最后一行被删除而不是第二行
命名
如果我更新Validate Labor函数以从ModelState中删除人工条目,那么
// validate labour
var labourDel = new List<AllocationLabourLine>();
var count = 0;
foreach (var l in entity.Labour)
{
var key = string.Format("Labour[{0}]", count);
if (string.IsNullOrEmpty(l.EmployeeName))
{
// set entity to be removed as we cannot remove from collection during the foreach
labourDel.Add(l);
// remove from ModelState
ModelState.Keys.Where(x => x.Contains(key)).ToList().ForEach(x => ModelState.Remove(x));
}
count++;
}
// remove items from collection
labourDel.ForEach(l => entity.Labour.Remove(l));
但是现在结果看起来像这样,仍然不理想,我们应该维护名称(1,2,3)
命名
关于如何从集合中删除空白人工条目并保持正确值的任何想法。
注意:此时此数据不会保存到数据库中,我们仍然在创建页面上。
编辑:在count ++中添加;我遗漏的代码,但是在我的应用程序代码中。