Asp.net mvc 4 如何在MVC4中从数据库中获取包含表头数据和行数据的HTML表
我在mvc项目中工作,我想生成一个gridview(html表)。头应该从db绑定,数据也应该从db动态绑定。 这是我的元数据或主表Asp.net mvc 4 如何在MVC4中从数据库中获取包含表头数据和行数据的HTML表,asp.net-mvc-4,razor,Asp.net Mvc 4,Razor,我在mvc项目中工作,我想生成一个gridview(html表)。头应该从db绑定,数据也应该从db动态绑定。 这是我的元数据或主表 Id Name Label Value Emp_id 31 Adhar DocumentNumber 12345678 1 32 Adhar ExpiryDate 1/1/2015 1 33 Pan DocumentNumber
Id Name Label Value Emp_id
31 Adhar DocumentNumber 12345678 1
32 Adhar ExpiryDate 1/1/2015 1
33 Pan DocumentNumber 123456789 2
34 Pan ExpiryDate 1/1/2015 2
36 Pan IssueLoc India 2
我的桌子应该是这样的。如果输入参数emp_id为1,则表应如下所示。这是HTML
<Table><tr><th>DocumentNumber</th><th>ExpiryDate</th><td>12345678 </td>1/1/2015<td></td></tr></table>
我在mvc4实体框架中工作。如何克服这个问题?谁能给我一些解决这个问题的办法吗。我搜寻了一下,什么也没找到。请给我一些想法。如果问题未解决,请让我知道
这是为emp_id和2
DocumentNumber ExpiryDate IssueLoc
12345678 1/1/2015 India
关于上述数据,我需要以
Name DocumentNumber ExpiryDate
Adhar 12345678 1/1/2015
Name DocumentNumber ExpiryDate IssuedLoc
Pan 123456789 1/1/2015 India
是的,根据我的要求,你提供的答案几乎是正确的。我试着自己做我需要的桌子,但没能得到。很抱歉打扰您如果我理解您的问题,将如下所示: 行动:
public ActionResult Test()
{
//Here I mock your DB, use EF context (context.table) instead of table variable or what you want.
var table = new List<MyItem> {
new MyItem { Label = "DocumentNumber", Value = "12345678", Emp_id = 1, Name = "First" },
new MyItem { Label = "ExpiryDate", Value = "1/1/2015", Emp_id = 1, Name = "First" },
new MyItem { Label = "IssueLoc", Value = "India", Emp_id = 1, Name = "First" },
new MyItem { Label = "DocumentNumber", Value = "SecondValue", Emp_id = 2, Name = "Second" },
new MyItem { Label = "ExpiryDate", Value = "SecondValue", Emp_id = 2, Name = "Second" },
};
var items = table.Where(x => x.Emp_id == 1 || x.Emp_id == 2).ToList();
var headers = items.Select(x => x.Label).Distinct().ToList();
var employers = items.Select(x => x.Emp_id).Distinct().ToList();
if(employers.Count > 1)
headers.Insert(0, "Name");
var data = new List<List<string>>();
data.Add(headers);
foreach (var emp in employers)
{
var row = new List<string>();
foreach (var header in headers)
{
if (header != "Name")
{
var cell = items.Where(x => x.Label == header && x.Emp_id == emp).FirstOrDefault();
row.Add(cell == null ? "" : cell.Value);
}
else
row.Add(items.Where(x => x.Emp_id == emp).First().Name);
}
data.Add(row);
}
return View(data);
}
@model List<List<string>>
<table>
<thead>
<tr>
@foreach (var header in Model.First())
{
<th>@header</th>
}
</tr>
</thead>
<tbody>
@foreach (var row in Model.Skip(1))
{
<tr>
@foreach (var cell in row)
{
<td>@cell</td>
}
</tr>
}
</tbody>
</table>
公共操作结果测试()
{
//在这里,我模拟您的DB,使用EF上下文(context.table),而不是表变量或您想要的。
var table=新列表{
新MyItem{Label=“DocumentNumber”,Value=“12345678”,Emp_id=1,Name=“First”},
新MyItem{Label=“ExpiryDate”,Value=“1/1/2015”,Emp_id=1,Name=“First”},
新MyItem{Label=“IssueLoc”,Value=“India”,Emp_id=1,Name=“First”},
新MyItem{Label=“DocumentNumber”,Value=“SecondValue”,Emp_id=2,Name=“Second”},
新的MyItem{Label=“ExpiryDate”,Value=“SecondValue”,Emp_id=2,Name=“Second”},
};
var items=table.Where(x=>x.Emp_id==1 | | x.Emp_id==2).ToList();
var headers=items.Select(x=>x.Label.Distinct().ToList();
var=items.Select(x=>x.Emp_id).Distinct().ToList();
如果(employers.Count>1)
标题。插入(0,“名称”);
var data=新列表();
数据。添加(标题);
foreach(雇主的var emp)
{
var row=新列表();
foreach(标头中的var标头)
{
如果(标题!=“名称”)
{
var cell=items.Where(x=>x.Label==header&&x.Emp_id==Emp.FirstOrDefault();
行添加(单元格==null?“:cell.Value);
}
其他的
添加(items.Where(x=>x.Emp\u id==Emp.First().Name);
}
添加数据(行);
}
返回视图(数据);
}
查看:
public ActionResult Test()
{
//Here I mock your DB, use EF context (context.table) instead of table variable or what you want.
var table = new List<MyItem> {
new MyItem { Label = "DocumentNumber", Value = "12345678", Emp_id = 1, Name = "First" },
new MyItem { Label = "ExpiryDate", Value = "1/1/2015", Emp_id = 1, Name = "First" },
new MyItem { Label = "IssueLoc", Value = "India", Emp_id = 1, Name = "First" },
new MyItem { Label = "DocumentNumber", Value = "SecondValue", Emp_id = 2, Name = "Second" },
new MyItem { Label = "ExpiryDate", Value = "SecondValue", Emp_id = 2, Name = "Second" },
};
var items = table.Where(x => x.Emp_id == 1 || x.Emp_id == 2).ToList();
var headers = items.Select(x => x.Label).Distinct().ToList();
var employers = items.Select(x => x.Emp_id).Distinct().ToList();
if(employers.Count > 1)
headers.Insert(0, "Name");
var data = new List<List<string>>();
data.Add(headers);
foreach (var emp in employers)
{
var row = new List<string>();
foreach (var header in headers)
{
if (header != "Name")
{
var cell = items.Where(x => x.Label == header && x.Emp_id == emp).FirstOrDefault();
row.Add(cell == null ? "" : cell.Value);
}
else
row.Add(items.Where(x => x.Emp_id == emp).First().Name);
}
data.Add(row);
}
return View(data);
}
@model List<List<string>>
<table>
<thead>
<tr>
@foreach (var header in Model.First())
{
<th>@header</th>
}
</tr>
</thead>
<tbody>
@foreach (var row in Model.Skip(1))
{
<tr>
@foreach (var cell in row)
{
<td>@cell</td>
}
</tr>
}
</tbody>
</table>
@型号列表
@foreach(Model.First()中的var头)
{
@标题
}
@foreach(Model.Skip(1)中的var行)
{
@foreach(行中的var单元格)
{
@细胞
}
}
您需要按名称对数据进行分组,然后为每个组创建一个单独的表。若要简化此操作,请添加另一个视图模型
public class GroupVM
{
public string Name { get; set; }
public IEnumerable<MyItem> Items { get; set; }
}
公共类GroupVM
{
公共字符串名称{get;set;}
公共IEnumerable项{get;set;}
}
在控制器方法中
public ActionResult Test()
{
var table = new List<MyItem> {
new MyItem { Label = "DocumentNumber", Value = "12345678", Emp_id = 1, Name = "First" },
new MyItem { Label = "ExpiryDate", Value = "1/1/2015", Emp_id = 1, Name = "First" },
new MyItem { Label = "IssueLoc", Value = "India", Emp_id = 1, Name = "First" },
new MyItem { Label = "DocumentNumber", Value = "SecondValue", Emp_id = 2, Name = "Second" },
new MyItem { Label = "ExpiryDate", Value = "SecondValue", Emp_id = 2, Name = "Second" },
};
var data = table.GroupBy(x => x.Name).Select(x => new GroupVM
{
Name = x.Key,
Items = x
});
return View(data);
}
公共操作结果测试()
{
var table=新列表{
新MyItem{Label=“DocumentNumber”,Value=“12345678”,Emp_id=1,Name=“First”},
新MyItem{Label=“ExpiryDate”,Value=“1/1/2015”,Emp_id=1,Name=“First”},
新MyItem{Label=“IssueLoc”,Value=“India”,Emp_id=1,Name=“First”},
新MyItem{Label=“DocumentNumber”,Value=“SecondValue”,Emp_id=2,Name=“Second”},
新的MyItem{Label=“ExpiryDate”,Value=“SecondValue”,Emp_id=2,Name=“Second”},
};
var data=table.GroupBy(x=>x.Name)。选择(x=>newgroupvm
{
Name=x.Key,
项目=x
});
返回视图(数据);
}
然后在视图中
@model IEnumerable<GroupVM>
@foreach(var group in Model)
{
<table>
<thead>
<tr>
<th>Name</th>
@foreach(var item in group.Items)
{
<th>@item.Label</th>
}
</tr>
</thead>
<tbody>
<tr>
<td>@group.Name</td>
@foreach(var item in group.Items)
{
<td>@item.Value</td>
}
</tr>
</tbody>
</table>
}
@model IEnumerable
@foreach(模型中的var组)
{
名称
@foreach(group.Items中的变量项)
{
@项目.标签
}
@组名
@foreach(group.Items中的变量项)
{
@项目.价值
}
}
请参阅是,但emp_id有3个字段,如何获取第三列?我刚才在问题(编辑的主要问题)中显示了是的,但对于emp_id有3个字段,那么如何获得第三列?我刚刚根据emp_id显示了问题(编辑的主问题),如果有两个字段我只想显示两个字段(例如,emp_id为1包含两个字段),如果有三个字段我想显示三个字段(例如emp_id为2),最后一种情况是如果我传递了两个emp_id,那么我想显示所有细节(如上表中的Adhar和Pan)。我的解决方案不依赖于具体字段或它们的数量,它是灵活和通用的。请看编辑后的答案,我只是向表变量集合添加了新元素。是的,我将研究解决方案。非常感谢Slava。如果我有任何疑问,我可以问你吗?嗨,Slava,我可以知道什么是模型。首先和模型。跳过。我需要创建任何视图模型吗?太好了逻辑。这就是我所需要的。谢谢斯蒂芬。你很久以来一直在帮助我。谢谢你。你似乎还有另一个应该删除的问题,假设这个答案也解决了这个问题。还有,当你得到一个对你有帮助的答案时,请投票,但除非它解决了你的问题,否则不要接受它——这会让其他用户感到困惑)好的,当然。我不知道。我试过你的答案,效果很好。如果所有项目的标签集都相同,应该是重复标题还是只需要一个顶部标题?