Asp.net mvc 4 如何在MVC4中从数据库中获取包含表头数据和行数据的HTML表

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

我在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  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,我可以知道什么是模型。首先和模型。跳过。我需要创建任何视图模型吗?太好了逻辑。这就是我所需要的。谢谢斯蒂芬。你很久以来一直在帮助我。谢谢你。你似乎还有另一个应该删除的问题,假设这个答案也解决了这个问题。还有,当你得到一个对你有帮助的答案时,请投票,但除非它解决了你的问题,否则不要接受它——这会让其他用户感到困惑)好的,当然。我不知道。我试过你的答案,效果很好。如果所有项目的标签集都相同,应该是重复标题还是只需要一个顶部标题?