提问人:RKh 提问时间:5/7/2015 最后编辑:Leonardo HenriquesRKh 更新时间:12/11/2018 访问量:13909
将 HTML 表发布到 ADO.NET DataTable
Post an HTML Table to ADO.NET DataTable
问:
我的视图中有一个HTML表格,如下所示:
<table id="tblCurrentYear">
<tr>
<td>Leave Type</td>
<td>Leave Taken</td>
<td>Leave Balance</td>
<td>Leave Total</td>
</tr>
@foreach (var item in Model.LeaveDetailsList)
{
<tr>
<td>@Html.TextBoxFor(m => item.LeaveType, new { width = "100" })</td>
<td>@Html.TextBoxFor(m => item.LeaveTaken, new { width = "100" })</td>
<td>@Html.TextBoxFor(m => item.LeaveBalance, new { width = "100" })</td>
<td>@Html.TextBoxFor(m => item.LeaveTotal, new { width = "100" })</td>
</tr>
}
</table>
我想遍历所有html表行,并在 ADO.NET DataTable中插入值。
简单来说,将 HTML 表格转换为 ADO.NET DataTable。
如何从HTML表格中提取值并插入到 ADO.NET DataTable中?
该视图基于以下模型
public class LeaveBalanceViewModel
{
public LeaveBalanceViewModel()
{
this.EmployeeDetail = new EmployeeDetails();
this.LeaveBalanceDetail = new LeaveBalanceDetails();
this.LeaveDetailsList = new List<LeaveBalanceDetails>();
}
public EmployeeDetails EmployeeDetail { get; set; }
public LeaveBalanceDetails LeaveBalanceDetail { get; set; }
public List<LeaveBalanceDetails> LeaveDetailsList { get; set; }
}
答:
87赞
user3559349
5/7/2015
#1
为了在回发时绑定到模型,窗体控件的属性必须与模型属性匹配。使用循环不会生成正确的名称属性。如果你检查html,你会看到多个实例name
foreach
<input type="text" name="item.LeaveType" .../>
但为了绑定到您的模型,控件需要
<input type="text" name="LeaveDetailsList[0].LeaveType" .../>
<input type="text" name="LeaveDetailsList[1].LeaveType" .../>
等。考虑这个问题的最简单方法是考虑如何在代码中访问属性的值LeaveType
C#
var model = new LeaveBalanceViewModel();
// add some LeaveBalanceDetails instances to the LeaveDetailsList property, then access a value
var leaveType = model.LeaveDetailsList[0].LeaveType;
由于您的 POST 方法将具有参数名称 (例如),只需删除前缀 (),这就是控件的 name 属性必须是这样的。为此,您必须使用循环(集合必须实现model
model
for
IList<T>
)
for(int i = 0; i < Model.LeaveDetailsList.Count; i++)
{
@Html.TextBoxFor(m => m.LeaveDetailsList[i].LeaveType)
....
}
或者使用自定义(集合只需要实现EditorTemplate
IEnumerable<T>
)
在/Views/Shared/EditorTemplates/LeaveBalanceDetails.cshtml
@model yourAssembly.LeaveBalanceDetails
<tr>
<td>@Html.TextBoxFor(m => m.LeaveType)</td>
....
</tr>
然后在主视图中(不是在循环中)
<table>
.... // add headings (preferably in a thead element
<tbody>
@Html.EditorFor(m => m.LeaveDetailsList)
</tbody>
</table>
最后,在控制器中
public ActionResult Edit(LeaveBalanceViewModel model)
{
// iterate over model.LeaveDetailsList and save the items
}
评论
1赞
Ian
8/19/2016
这解释了前缀名称中必须包含的内容,才能使 razor 引擎可检测到列表。谢谢!;)
1赞
Andy
3/17/2017
这很有帮助!不过,我仍然遇到一个问题 - 我将模型类型更改为 List 而不是 IEnumerable,并使用 For 循环而不是 For Each 在 View 中遍历它。但是,当我提交时,它会到达控制器,而我的模型什么都没有!为什么会是虚无?
1赞
3/17/2017
@Andarta,没有看到你的代码,我不知道你犯了什么错误。您需要提出一个问题,显示相关详细信息,我们将能够:)回答它
9赞
lashja
6/11/2017
#2
根据您的要求,请尝试以下操作
jQuery(document).on("change", ".DDLChoices", function (e) {
var comma_ChoiceIds = '';
var comma_ChoicesText = '';
$('input[class="DDLChoices"]').each(function (e) {
if (this.checked) {
comma_ChoiceIds = comma_ChoiceIds + $(this).val() + ',';
comma_ChoicesText = comma_ChoicesText + $(this).parent('label').parent() + ',';
}
});
$('#ChoiceIds').val(comma_ChoiceIds);
$('#ChoiceText').val(comma_ChoicesText);
});
@using (Html.BeginForm("Actionname", "Controllername", FormMethod.Post, new { id = "frmChoices" }))
{
@Html.HiddenFor(m => m.ChoiceText, new { @id = "ChoiceText" })
@Html.HiddenFor(m => m.ChoiceIds, new { @id = "ChoiceIds" })
<div class="form-group">
<div>
<table>
<tr>
<th>Name</th>
<th>Selected</th>
</tr>
@foreach (var item in @Model.Choices)
{
<tr>
<td> <label>@item.ChoicesText</label> </td>
<td> <input class="DDLChoices" value="@item.ChoiceIds" type="checkbox" /></td>
</tr>
}
</table>
</div>
<input type="button" value="Submit" onclick="return ChoicesPoster.passChoices()"
</div>
}
下一个:在 C 循环中捕获的变量#
评论
foreach
for
EditorTemplate
foreach
name="LeaveType"
LeaveBalanceDetail[0].LeaveType
LeaveBalanceDetail[1].LeaveType