編集可能なデータのテーブルをレンダリングするビューがあります。このページには、テーブルの単一行を追加および削除できる Ajax コントロールがあります。これは、IEnumerable から派生したモデルを持つ厳密に型指定されたビューで実現します。ビューでは、モデル内の各アイテムをループし、そのオブジェクトに厳密に型指定された部分ビューを使用してレンダリングします。このようにして、コントローラーは親ビューを使用してリスト全体をレンダリングでき、Ajax エンドポイントは部分ビューを使用してレンダリングし、jQuery がテーブルに挿入するテーブル行を 1 つだけ返すことができます。
保存ボタンをクリックすると、jQuery はテーブルをループし、データをパッケージ化し、データがサーバーに POST されたときにモデル バインディング エンジンがデータを として認識するように連番を割り当てますIEnumerable<TimeLogEntry>
。
これが私のリストビューです(不要なコードは削除されています):
@model IEnumerable<TimeTracker.Models.TimeLogEntry>
<table id="time-log">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.FirstOrDefault().StartTime)
</th>
<th>
@Html.DisplayNameFor(model => model.FirstOrDefault().EndTime)
</th>
<th>
@Html.DisplayNameFor(model => model.FirstOrDefault().Description)
</th>
</tr>
</thead>
<tbody>
foreach (var item in Model.OrderByDescending(entry => entry.StartTime))
{
Html.RenderPartial("~/Views/TimeLog/_EditEntry.cshtml", item);
}
</tbody>
</table>
そして、単一の を表示する部分ビューTimeLogEntry
:
@model TimeTracker.Models.TimeLogEntry
<tr id="@Model.TimeLogEntryId">
<td class="no-wrap">
@Html.EditorFor(model => model.StartTime)
@Html.ValidationMessageFor(model => model.StartTime)
</td>
<td class="no-wrap">
@Html.EditorFor(model => model.EndTime)
@Html.ValidationMessageFor(model => model.EndTime)
</td>
<td>
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</td>
</tr>
このコードは、それをレンダリングする部分ビューが項目の元の IEnumerable から分離されているため、適切に検証されません。したがって、foreach ループのコンテキストで実行されていることがわかりません。したがって、テーブルの各行の要素は同じ名前と ID を持つことになり、クライアント側の検証で問題が発生します。たとえば、すべてのStartTime
テキスト ボックスの ID は、 、 などStartTime
ではなく、です。EditorFor メソッドには、または属性を設定する方法がありません。各テキストボックス属性を一意にし、各検証メッセージの属性を対応するテキストボックス ID と一致させるにはどうすればよいですか? これを行うべき別のより良い方法はありますか?[0].StartTime
[1].StartTime
id
data-valmsg-for
id
data-valmsg-for