2015-05-07 11 views
27

Mam tabeli HTML jak poniżej moim zdaniem:post tabeli HTML do ADO.NET DataTable

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

Chcę iterację wszystkich wierszy tabeli html i wstawić wartości w ADO.NET DataTable.

Proste mówienie, konwersja tabeli HTML na ADO.NET DataTable.

Jak wyodrębnić wartości z tabeli HTML i wstawić do ADO.NET DataTable?

Widok jest oparta na następującym modelu

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

Szukasz uzyskać wartości polu tekstowym stołem i wkładką do bazy danych lub kompletny html musi wstawić? –

+3

Czy nie było jasne z naszych komentarzy do twojego ostatniego pytania, że ​​** nie możesz ** użyć pętli 'foreach' do generowania kontroli w kolekcji. Potrzebujesz pętli 'for' lub niestandardowego' EditorTemplate' dla modelu. Twoja pętla foreach nie przywiąże niczego. –

+0

@StephenMuecke Ale foreach działa i mogę wypełnić go tabelą HTML. Po wygenerowaniu tej tabeli użytkownik może zmienić wartość w dowolnym polu tekstowym i kliknąć przycisk Zapisz.Po kliknięciu Zapisz, chcę wybrać wszystkie wartości TextBox (rząd po wierszu) i wstawić do ADO.NET DataTable. – RKh

Odpowiedz

39

w celu wiązania się z modelu na stanowisku powrotem atrybuty name z kontroli formy muszą być dostosowane do właściwości modelu. Używanie pętli foreach nie generuje poprawnych atrybutów nazwy. Jeśli skontrolować html widać wiele wystąpień

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

ale w celu związania do modelu kontrole musiałyby być

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

itd. Najprostszym sposobem, aby myśleć o to, aby rozważyć w jaki sposób uzyskać dostęp do wartości nieruchomości LeaveType w kodzie C#

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

Ponieważ metoda POST będzie mieć nazwę parametru (słownie model), po prostu upuść prefiks (model) i tak musi być atrybut nazwy kontrolki. W tym celu należy skorzystać z jednej z for pętlę (kolekcja musi wdrożyć IList<T>)

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

lub użyć niestandardowego EditorTemplate (zbieranie musi wdrożyć tylko IEnumerable<T>)

w /Views/Shared/EditorTemplates/LeaveBalanceDetails.cshtml

@model yourAssembly.LeaveBalanceDetails 
<tr> 
    <td>@Html.TextBoxFor(m => m.LeaveType)</td> 
    .... 
</tr> 

, a następnie w widoku głównym (nie w pętli)

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

i wreszcie, w sterowniku

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

Wyjaśnia to, co musi znajdować się w nazwie prefiksu, aby lista była wykrywalna przez maszynę. Dzięki! ;) – Ian

+0

To było bardzo pomocne! Nadal mam jednak problem - zmieniłem typ modelu na Listę zamiast IEnumerable i iteruję za jego pomocą w widoku przy użyciu pętli For zamiast for Each. Kiedy jednak składam, dostaje się do kontrolera, a mój model nie ma nic! Dlaczego miałoby to być nic? – Andarta

+0

@Andarta, Nie widząc twojego kodu, nie mam pojęcia, jakie błędy popełniłeś. Musisz zadać pytanie, pokazując odpowiednie szczegóły, a my będziemy mogli odpowiedzieć :) –

1

w stosunku do zapotrzebowania, spróbuj tego

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" })) 
 
{ 
 
\t 
 
    @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> 
 
\t \t <input type="button" value="Submit" onclick="return ChoicesPoster.passChoices()" 
 
\t \t </div> 
 
\t }