0

編集可能なデータのテーブルをレンダリングするビューがあります。このページには、テーブルの単一行を追加および削除できる 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].StartTimeiddata-valmsg-foriddata-valmsg-for

4

1 に答える 1

0

ビューを次のように再定義できます(部分を使用せずに)

@model IEnumerable<TimeTracker.Models.TimeLogEntry>
<table id="time-log">
    ...other stuff that you want to add 
    <tbody>
        @{var itemList = Model.OrderByDescending(entry => entry.StartTime).ToList(); }
        @for(var index =0 ; index < itemList.Count;index ++)
        {
           <tr id="@Model.TimeLogEntryId">
             <td class="no-wrap">
                @Html.EditorFor(model => model[index].StartTime)
                @Html.ValidationMessageFor(model => model[index].StartTime)
            </td>
            <td class="no-wrap">
               @Html.EditorFor(model => model[index].EndTime)
               @Html.ValidationMessageFor(model => model[index].EndTime)
            </td>
            <td>
               @Html.EditorFor(model => model[index].Description)
               @Html.ValidationMessageFor(model => model[index].Description)
            </td>
          </tr>
        }
    </tbody>
</table>
于 2012-12-27T22:02:32.397 に答える