Pubblica una tabella HTML su ADO.NET DataTable

Ho una tabella HTML come sotto nella mia 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" })

Voglio scorrere tutte le righe della tabella html e inserire i valori in ADO.NET DataTable.

Parlando in modo semplice, convertire la tabella HTML in ADO.NET DataTable.

Come estrarre i valori dalla tabella HTML e inserirli in DataTable ADO.NET?

La vista è basata sul seguente modello

 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; } } 

Per associare un modello al postback, gli attributi del name dei controlli del modulo devono corrispondere alle proprietà del modello. L’utilizzo di un ciclo foreach non genera gli attributi del nome corretti. Se controlli l’html vedrai più istanze di

  

ma al fine di bind al tuo modello i controlli dovrebbero essere

   

ecc. Il modo più semplice per pensarci è considerare come si accederà al valore di una proprietà LeaveType nel codice C#

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

Poiché il metodo POST avrà un nome parametro (ad esempio model ), basta rilasciare il prefisso ( model ) ed è così che deve essere l’attributo nome del controllo. Per fare ciò devi usare un ciclo for (la collezione deve implementare IList )

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

oppure utilizzare un EditorTemplate personalizzato (la raccolta deve solo implementare IEnumerable )

In /Views/Shared/EditorTemplates/LeaveBalanceDetails.cshtml

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

e poi nella vista principale (non in un ciclo)

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

e infine, nel controller

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

Rispetto al tuo requisito, prova questo

 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
}