将HTML表发布到ADO.NET DataTable


71

我的视图中有一个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 Table转换为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; }
}

1
您是否正在寻找获取表的文本框值并插入数据库或需要插入的完整HTML?
Jinesh Jain 2015年

6
从我们对您的最后一个问题的评论中还不清楚您不能使用foreach循环在集合中生成控件吗?您需要模型的for循环或自定义EditorTemplate。您的foreach循环不会绑定任何东西。

1
@StephenMuecke但是foreach正在工作,我可以用它填充HTML表。生成此表后,用户可以在任何TextBox中更改值,然后单击Save按钮。在单击“保存”时,我要选择所有TextBox值(逐行)并将其插入ADO.NET DataTable。
RKh,2015年

4
不,不是-您可以在视图中看到值,但是回发时不能绑定任何内容。检查生成的html-您有多个带有的文本框name="LeaveType"。为了绑定到您的收藏上回发,控件必须LeaveBalanceDetail[0].LeaveTypeLeaveBalanceDetail[1].LeaveType等等

1
为什么需要将这些添加到ADO.Net表中?您是否正在将这些保存到数据库中?
Mairaj Ahmad

Answers:


79

为了在回发时绑定到模型,name表单控件的属性必须与模型属性匹配。您使用foreach循环不会生成正确的名称属性。如果您检查html,则会看到多个实例

<input type="text" name="item.LeaveType" .../>

但是为了绑定到模型,控件需要

<input type="text" name="LeaveDetailsList[0].LeaveType" .../>
<input type="text" name="LeaveDetailsList[1].LeaveType" .../>

等。考虑这一点的最简单方法是考虑如何LeaveTypeC#代码中访问属性的值

var model = new LeaveBalanceViewModel();
// add some LeaveBalanceDetails instances to the LeaveDetailsList property, then access a value
var leaveType = model.LeaveDetailsList[0].LeaveType;

由于您的POST方法将具有参数名称(例如model),因此只需删除前缀(model),这就是控件的name属性必须是的方式。为此,您必须使用一个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
这说明了前缀名称中必须包含什么,以使剃刀引擎可以检测到列表。谢谢!;)
伊恩

1
这非常有帮助!但是,我仍然遇到问题-我将模型类型更改为List而不是IEnumerable,并使用For循环而不是For Each在View中进行迭代。但是,当我提交时,它就到达了Controller,而我的模型什么也没有!为什么什么都没有?
安迪

1
@Andarta,没有看到您的代码,我不知道您犯了什么错误。您需要提出一个问题,并显示相关的详细信息,我们将能够回答这个问题:)

8

根据您的要求,尝试一下

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>
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.