手がかりのリストを含む「TreasureHuntDetails」オブジェクトにバインドするビュー モデルがあります。これがそのデータモデルの一部です。
public TreasureHuntDetails()
{
Clues = new List<Clue>();
}
[Key]
public int TreasureHuntId { get; set; }
public List<Clue> Clues { get; set; }
ページにテーブルがあります。foreach ループは、手がかりのリストを繰り返し処理して、手がかりをテーブルに追加します。
@for (int i = 0; i < Model.Clues.Count; i++)
for ループ内のテーブル要素は非常に大きいですが、テーブル要素列の 1 つの例を次に示します。
<td>@Html.DisplayFor(m => Model.Clues[i].Location)</td>
これまでのところ、すべて順調です。次に、JQuery UI を使用して、次のように、ドラッグ アンド ドロップを使用してテーブルの項目を並べ替えることができるようにしています。
<script type="text/javascript">
$(document).ready(function()
{
$("#clueTable tbody").sortable().disableSelection();
});
</script>
要素をドラッグ アンド ドロップできます。
問題は、要素の新しい順序を保存してデータベースに保存する方法がわからないことです。
私が最初に試みたのは、単に手がかりのリストをコントローラー メソッドに渡すことでしたが、手がかりのリストがコントローラー メソッドに到達すると、それは常に null であることがわかりました。
例えば:
@Url.Action("ViewCluePage", @Model.Clues)
@Model 全体を送信しても、その中の手がかりのリストは常に null です。データ モデルのコンストラクターから新しいリストのインスタンス化を削除しても、この問題は解決しませんでした。
私が試したもう 1 つのことは、テーブル全体を HTML フォームにラップすることでしたが、それでも手がかりのリストは null のままです。
つまり、基本的に、この質問は実際には 2 つの質問です。
1) モデル オブジェクトをコントローラーに送信した後、手がかりのリストが常に null になるのはなぜですか。
2) アイテムのリストの新しい順序を保存する方法は?
更新: @recursive による提案に従って、手がかり要素を HTML フォームに送信しようとしたときにどこでエラーが発生したかがわかります。
手がかり要素を反復処理する for ループの外側でこれを使用しました。
@Html.HiddenFor(m => m.Clues)
for ループ内 (手がかりアイテムごと) に HiddenFor 行を追加し、手がかりアイテムの各プロパティに追加する必要がありました。
@Html.HiddenFor(m => m.Clues[i].Id)
リスト項目をコントローラーに送信できるようになることは一歩前進ですが、コントローラーに送信されたときに手がかり項目の新しい順序を反映するコードが必要だと思います。現在、JQuery の sortable() メソッドを使用して画面上の要素の順序を並べ替えても、要素はビューにバインドされたデータ モデル (@Model.Clues) に格納されているため、要素の順序は変更されません。