2015-05-07 10 views
27

ich eine HTML-Tabelle in meiner Ansicht, wie unten habe:Post einer HTML-Tabelle zu 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> 

ich alle durch die HTML-Tabellenzeilen wiederholen will, und die Werte in ADO.NET Datatable einfügen.

Einfach gesprochen, konvertieren HTML-Tabelle zu ADO.NET DataTable.

Wie extrahiert man Werte aus der HTML-Tabelle und fügt sie in ADO.NET DataTable ein?

Die Ansicht auf das folgende Modell basiert

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

Suchen Sie die Textfeld Werte der Tabelle erhalten und Einsatz in Datenbank oder komplettes HTML muss einfügen? –

+3

War es aus unseren Kommentaren zu Ihrer letzten Frage nicht klar, dass Sie ** keine foreach-Schleife verwenden können, um Steuerelemente in einer Sammlung zu generieren. Sie benötigen eine 'for' -Schleife oder eine benutzerdefinierte' EditorTemplate' für das Modell. Deine 'foreach'-Schleife bindet sich nicht an irgendetwas. –

+0

@StephenMuecke Aber die Foreach funktioniert und ich kann HTML-Tabelle damit füllen. Sobald diese Tabelle generiert wurde, kann der Benutzer den Wert in einer beliebigen TextBox ändern und auf die Schaltfläche Speichern klicken.Beim Klicken auf "Speichern" möchte ich alle TextBox-Werte (zeilenweise) auswählen und sie in ADO.NET DataTable einfügen. – RKh

Antwort

39

Um ein Modell auf Post zu binden, die name Attribute der Form Kontrollen müssen die Modelleigenschaften zurück, entsprechen. Ihre Verwendung einer foreach-Schleife generiert nicht die korrekten Namensattribute. Wenn Sie die HTML-inspizieren Sie mehrere Instanzen von

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

aber zu binden, um zu Ihrem Modell sehen die Kontrollen benötigen würden

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

usw. Der einfachste Weg zu sein, darüber nachzudenken, dies ist zu Sehen Sie, wie Sie den Wert eines LeaveType Eigenschaft in C# Code zugreifen würde

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

Da Ihr POST-Methode wird einen Parameternamen haben (sagen wir model), lassen Sie einfach das Präfix (model) fallen und so muss das name-Attribut des Controls sein. Um das zu tun, dass Sie entweder eine for Schleife verwenden müssen

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

(muss die Sammlung IList<T> implementieren) oder eine benutzerdefinierte EditorTemplate (die Sammlung braucht nur IEnumerable<T> zu implementieren)

In /Views/Shared/EditorTemplates/LeaveBalanceDetails.cshtml

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

und dann in der Hauptansicht (nicht in einer Schleife)

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

und schließlich in der Steuerung

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

Dies erklärt, was im Präfixnamen enthalten sein muss, damit eine Liste von der Rasiermaschinen-Engine erkannt werden kann. Vielen Dank! ;) – Ian

+0

Das war sehr hilfreich! Ich habe jedoch immer noch ein Problem - ich habe meinen Modelltyp in eine Liste anstelle von IEnumerable geändert und iteriere sie in der Ansicht mit einer For-Schleife anstelle von For Each. Wenn ich es eingebe, kommt es allerdings zum Controller, und mein Modell gibt es Nothing! Warum sollte es nichts sein? – Andarta

+0

@Andarta, Ohne Ihren Code zu sehen, habe ich keine Ahnung, welche Fehler Sie gemacht haben. Sie müssen eine Frage stellen, die relevanten Details zeigen und wir können sie beantworten :) –

1

Im Hinblick auf Ihre Anforderung, versuchen Sie diese

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 }

Verwandte Themen