Postar uma tabela HTML no ADO.NET DataTable

Eu tenho uma tabela HTML como abaixo na minha visualização:

 @foreach (var item in Model.LeaveDetailsList) {  } 
Leave Type Leave Taken Leave Balance Leave Total
@Html.TextBoxFor(m => item.LeaveType, new { width = "100" }) @Html.TextBoxFor(m => item.LeaveTaken, new { width = "100" }) @Html.TextBoxFor(m => item.LeaveBalance, new { width = "100" }) @Html.TextBoxFor(m => item.LeaveTotal, new { width = "100" })

Eu quero iterar através de todas as linhas da tabela html e inserir os valores no ADO.NET DataTable.

Falar simples, convertendo a tabela HTML para o ADO.NET DataTable.

Como extrair valores da tabela HTML e inserir no ADO.NET DataTable?

A visão é baseada no seguinte modelo

 public class LeaveBalanceViewModel { public LeaveBalanceViewModel() { this.EmployeeDetail = new EmployeeDetails(); this.LeaveBalanceDetail = new LeaveBalanceDetails(); this.LeaveDetailsList = new List(); } public EmployeeDetails EmployeeDetail { get; set; } public LeaveBalanceDetails LeaveBalanceDetail { get; set; } public List LeaveDetailsList { get; set; } } 

   

Para vincular a um modelo na postagem, os atributos de name dos controles de formulário devem corresponder às propriedades do modelo. Seu uso de um loop foreach não gera os atributos de nome corretos. Se você inspecionar o html, você verá várias instâncias de

  

mas, a fim de vincular ao seu modelo, os controles precisariam ser

   

A maneira mais fácil de pensar sobre isso é considerar como você LeaveType o valor de uma propriedade LeaveType no código C#

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

Como seu método POST terá um nome de parâmetro (digamos, model ), apenas elimine o prefixo ( model ) e é assim que o atributo de nome do controle deve ser. Para fazer isso, você deve usar um loop for (a coleção deve implementar o IList )

 for(int i = 0; i < Model.LeaveDetailsList.Count; i++) { @Html.TextBoxFor(m => m.LeaveDetailsList[i].LeaveType) .... } 

ou use um EditorTemplate personalizado (a coleção só precisa implementar IEnumerable )

Em /Views/Shared/EditorTemplates/LeaveBalanceDetails.cshtml

 @model yourAssembly.LeaveBalanceDetails  @Html.TextBoxFor(m => m.LeaveType) ....  

e depois na visualização principal (não em um loop)

  .... // add headings (preferably in a thead element  @Html.EditorFor(m => m.LeaveDetailsList) 

e finalmente, no controlador

 public ActionResult Edit(LeaveBalanceViewModel model) { // iterate over model.LeaveDetailsList and save the items } 

Com relação a sua exigência, tente este

 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" }) 
@foreach (var item in @Model.Choices) { }
Name Selected
}