Pro*_*ofK 2 asp.net asp.net-mvc asp.net-mvc-3
我在一个返回a的.xls电子表格[1]之间有一个可靠且经过测试的导入方法DataTable.我已将此位于我的服务层,而不是数据,因为只有工作簿被保存为上传文件,但现在我想知道在哪里以及如何生成这种HTML表示DataTable.在我看来,我宁愿避免两个循环.我有一个可变数量的列DataTable.
[1]使用OleDb接口.我知道这很古老,但它确实有效.
Dar*_*rov 15
DataTables是弱类型的.我讨厌弱打字.
这是另一种方法:使用视图模型,强类型视图和显示模板.首先定义一个视图模型,它将代表您愿意显示的信息:
public class MyViewModel
{
public IEnumerable<ColumnViewModel> Columns { get; set; }
public IEnumerable<RowViewModel> Rows { get; set; }
}
public class ColumnViewModel
{
public string Name { get; set; }
}
public class RowViewModel
{
public IEnumerable<CellValueViewModel> Values { get; set; }
}
public class CellValueViewModel
{
public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后你可以有一个控制器动作来填充这个视图模型.如果您已经有一些吐出DataTables的服务层,您可以将这些表映射到上述视图模型.为了这个演示的目的,让我们硬编码:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
Columns = new[]
{
new ColumnViewModel { Name = "column1" },
new ColumnViewModel { Name = "column2" },
new ColumnViewModel { Name = "column3" },
},
Rows = new[]
{
new RowViewModel
{
Values = new[]
{
new CellValueViewModel { Value = "1x1" },
new CellValueViewModel { Value = "1x2" },
new CellValueViewModel { Value = "1x3" },
}
},
new RowViewModel
{
Values = new[]
{
new CellValueViewModel { Value = "2x1" },
new CellValueViewModel { Value = "2x2" },
new CellValueViewModel { Value = "2x3" },
}
},
new RowViewModel
{
Values = new[]
{
new CellValueViewModel { Value = "3x1" },
new CellValueViewModel { Value = "3x2" },
new CellValueViewModel { Value = "3x3" },
}
}
}
};
return View(model);
}
}
Run Code Online (Sandbox Code Playgroud)
最后一部分是view(~/Views/Home/Index.cshtml):
@model MyViewModel
<table>
<thead>
<tr>
@Html.DisplayFor(x => x.Columns)
</tr>
</thead>
<tbody>
@Html.DisplayFor(x => x.Rows)
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
和我们的显示模板:
~/Views/Home/DisplayTemplates/ColumnViewModel.cshtml:
@model ColumnViewModel
<th>
@Html.DisplayFor(x => x.Name)
</th>
Run Code Online (Sandbox Code Playgroud)
~/Views/Home/DisplayTemplates/RowViewModel.cshtml:
@model RowViewModel
<tr>
@Html.DisplayFor(x => x.Values)
</tr>
Run Code Online (Sandbox Code Playgroud)
~/Views/Home/DisplayTemplates/CellValueViewModel.cshtml:
@model CellValueViewModel
<td>
@Html.DisplayFor(x => x.Value)
</td>
Run Code Online (Sandbox Code Playgroud)
这就是全部.正如您所看到的,我们在视图中编写了完全零循环,最后我们得到了一个<table>代表Excel工作表的漂亮结构.