美好的一天,
我是MVC的新手。 问题:数据重复(重复)。 假设填充了不同的数据,但它看起来是相同的记录。 它占用了最后一条记录并显示所有记录相同(重复)。 我不知道我的错误在哪里。
我检查了'Qdata'填充正确的数据。但是去看模型时一直是重复的。
控制器
List<ApprovalVM> SmPSetVM = new List<ApprovalVM>();
ApprovalVM setVM = new ApprovalVM();
var Qdata = (from u in db.SSM_RegisSet
join c in db.SSM_LinkRegisUpload on u.PKRegisId equals c.FKRegisId
join v in db.SSM_UploadData on c.FKUpDid equals v.UplId
join b in db.SSM_User on u.FKUserId equals b.PK_Uid
join g in db.SSM_Department on b.FK_DepartId equals g.PK_DeptId
join t in db.SSM_Team on b.FK_TeamId equals t.PK_TeamId
join k in db.SSM_GM on b.FK_GMId equals k.PK_GM_id
//where v.SN_NO == da
//orderby u.AutoEC_id
select new
{
v.PO_NO,
v.SN_NO,
v.Exp_NO,
v.Model,
v.PlanDate,
v.Holder_Id,
ids = "I000" + u.PKRegisId,
c.PKLinkId,
g.HODName,
b.PK_Uid,
b.UserName,
t.PK_TeamId,
t.TeamLeaderName,
k.GMName
}).ToList().OrderByDescending(v=>v.PKLinkId);
foreach (var item in Qdata)//.Where(x => x.SN_NO == da))
{
setVM.PO_NO = item.PO_NO;
setVM.SN_NO = item.SN_NO;
setVM.Exp_NO = item.Exp_NO;
setVM.Model = item.Model;
setVM.PlanDate = item.PlanDate;
setVM.Holder_Id = item.Holder_Id;
setVM.POSNId = item.ids;
setVM.PKLinkId = item.PKLinkId;
setVM.PK_TeamId = item.PK_TeamId;
setVM.HODName = item.HODName;
setVM.PK_Uid = item.PK_Uid;
setVM.UserName = item.UserName;
setVM.TeamLeaderName = item.TeamLeaderName;
setVM.GMName = item.GMName;
SmPSetVM.Add(setVM);
}
return View(SmPSetVM);
查看模型
public class ApprovalVM
{
// User
public int PK_Uid { get; set; }
public string UserName { get; set; }
public string FullName { get; set; }
// Team Leader
public int PK_TeamId { get; set; }
public string TeamName { get; set; }
public string TeamLeaderName { get; set; }
// GM Name
public int PK_GM_id { get; set; }
public string GMName { get; set; }
public Nullable<bool> GMIsVisible { get; set; }
//Department
public int PK_DeptId { get; set; }
public string DepartmentName { get; set; }
public string HODName { get; set; }
//Upload Data
public int UplId { get; set; }
[Display(Name = "PO No")]
public string PO_NO { get; set; }
[Display(Name = "S/N")]
public string SN_NO { get; set; }
[Display(Name = "Exp No")]
public string Exp_NO { get; set; }
public string Model { get; set; }
public string PlanDate { get; set; }
public string Holder_Id { get; set; }
// Regis Id
public string POSNId { get; set; }
//Link
public int PKLinkId { get; set; }
// List of Approval
//public List<ApprovalVM> ListApproval { get; set; }
}
查看
<div class="col-lg-11">
<div class="panel-body table-responsive">
<table class="table table-striped" id="IntTrntbl">
<tr>
<th>
No
</th>
<th>
@Html.DisplayNameFor(model => model.POSNId)
</th>
<th>
@Html.DisplayNameFor(model => model.PO_NO)
</th>
<th>
@Html.DisplayNameFor(model => model.SN_NO)
</th>
<th>
@Html.DisplayNameFor(model => model.Exp_NO)
</th>
<th>
@Html.DisplayNameFor(model => model.Model)
</th>
<th>
@Html.DisplayNameFor(model => model.PlanDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Holder_Id)
</th>
<th>
@Html.DisplayNameFor(model => model.PKLinkId)
</th>
</tr>
@{int a = 1;}
@foreach (var item in Model)
{
<tr>
<td>
@(a++)
</td>
<td style="width:10%">
@Html.DisplayFor(modelItem => item.POSNId)
</td>
<td>
@Html.DisplayFor(modelItem => item.PO_NO)
</td>
<td>
@Html.DisplayFor(modelItem => item.SN_NO)
</td>
<td>
@Html.DisplayFor(modelItem => item.Exp_NO)
</td>
<td>
@Html.DisplayFor(modelItem => item.Model)
</td>
<td>
@Html.DisplayFor(modelItem => item.PlanDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Holder_Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.PKLinkId)
</td>
</tr>
}
</table>
</div>
</div>
提前致谢!
答案 0 :(得分:1)
您正在循环的每次迭代中更新相同的对象。您初始化setVM
一次,然后多次将其添加到列表中。因此,列表包含同一项的多个条目。当您更新foreach中的对象时,所有指向该项的引用都会引用新值。
在每次迭代中实例化一个新项目:
foreach (var item in Qdata)//.Where(x => x.SN_NO == da))
{
setVM = new ApprovalVM();
setVM.PO_NO = item.PO_NO;
setVM.SN_NO = item.SN_NO;
setVM.Exp_NO = item.Exp_NO;
setVM.Model = item.Model;
setVM.PlanDate = item.PlanDate;
setVM.Holder_Id = item.Holder_Id;
setVM.POSNId = item.ids;
setVM.PKLinkId = item.PKLinkId;
setVM.PK_TeamId = item.PK_TeamId;
setVM.HODName = item.HODName;
setVM.PK_Uid = item.PK_Uid;
setVM.UserName = item.UserName;
setVM.TeamLeaderName = item.TeamLeaderName;
setVM.GMName = item.GMName;
SmPSetVM.Add(setVM);
}
但是如果已经使用了linq,那么你可以在查询中改进和投射这个类(并使用对象初始化器语法):
return View((from u in db.SSM_RegisSet
join c in db.SSM_LinkRegisUpload on u.PKRegisId equals c.FKRegisId
join v in db.SSM_UploadData on c.FKUpDid equals v.UplId
join b in db.SSM_User on u.FKUserId equals b.PK_Uid
join g in db.SSM_Department on b.FK_DepartId equals g.PK_DeptId
join t in db.SSM_Team on b.FK_TeamId equals t.PK_TeamId
join k in db.SSM_GM on b.FK_GMId equals k.PK_GM_id
//where v.SN_NO == da
//orderby u.AutoEC_id
select new ApprovalVM {
PO_NO = v.PO_NO,
//And so on
}).OrderByDescending(v=>v.PKLinkId).ToList());
最后,如果使用EF,则读入Navigation Properties。将使连接更加简单。
答案 1 :(得分:1)
这是因为你没有在foreach循环中实例化一个新的setVM。您应该在foreach循环中移动setVM对象的初始化(ApprovalVM setVM = new ApprovalVM();)。 在每次迭代中,您都会修改同一个对象并将其添加到列表中。