1. ホーム
  2. c#

HTMLのテーブルをADO.NETのDataTableに投稿する

2023-10-31 21:27:11

質問

ビューに以下のようなHTMLテーブルがあります。

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

htmlテーブルのすべての行を反復処理し、ADO.NET DataTableに値を挿入したいと思います。

簡単に言えば、HTMLテーブルをADO.NET DataTableに変換することです。

HTMLテーブルから値を抽出し、ADO.NET DataTableに挿入するにはどうすればよいですか?

ビューは次のモデルに基づいています。

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

どのように解決するのですか?

ポストバック時にモデルにバインドするために name 属性がモデルのプロパティと一致しなければなりません。フォームコントロールの foreach ループを使用すると、正しい名前の属性が生成されません。html を調べてみると、複数の

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

しかし、モデルにバインドするために、コントロールは

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

などです。このことについて考える最も簡単な方法は、あなたがどのように LeaveType のプロパティの値にアクセスする方法を考えることです。 C# コード

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

POSTメソッドにはパラメータ名(例えば model のように)、プレフィックス( model ) を削除すれば、コントロールの name 属性はそのようになるはずです。これを行うには、コントロールの名前属性として for ループを使用しなければなりません (コレクションは IList<T> )

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

またはカスタム EditorTemplate を使うか (コレクションは IEnumerable<T> )

/Views/Shared/EditorTemplates/LeaveBalanceDetails.cshtml

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

そして、メインビューで(ループ内ではありません)

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

で、最後にコントローラで

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