Publicar una tabla HTML en ADO.NET DataTable

Tengo una tabla HTML como la siguiente en mi Vista:

 @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" })

Quiero iterar a través de todas las filas de la tabla html e insertar los valores en ADO.NET DataTable.

Hablando en forma simple, convirtiendo HTML Table en ADO.NET DataTable.

¿Cómo extraer valores de HTML Table e insertarlos en ADO.NET DataTable?

La vista se basa en el siguiente 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 enlazar a un modelo en la publicación posterior, los atributos de name de los controles de formulario deben coincidir con las propiedades del modelo. El uso de un bucle foreach no genera los atributos de nombre correctos. Si inspecciona el html, verá múltiples instancias de

  

pero para vincular a su modelo, los controles necesitarían ser

   

etc. La manera más fácil de pensar sobre esto es considerar cómo accedería al valor de una propiedad LeaveType en C# 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; 

Dado que su método POST tendrá un nombre de parámetro (por ejemplo, model ), simplemente suelte el prefijo ( model ) y así es como debe ser el atributo de nombre del control. Para hacerlo, debe usar un bucle for (la colección debe implementar IList )

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

o use un EditorTemplate personalizado (la colección solo necesita implementar IEnumerable )

En /Views/Shared/EditorTemplates/LeaveBalanceDetails.cshtml

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

y luego en la vista principal (no en un bucle)

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

y finalmente, en el controlador

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

Con respecto a su requisito, intente esto

 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
}