Tengo una tabla HTML como la siguiente en mi Vista:
Leave Type Leave Taken Leave Balance Leave Total @foreach (var item in Model.LeaveDetailsList) { @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" }) Name Selected @foreach (var item in @Model.Choices) { }
}