この質問のバリエーションが多く聞かれるように見えるので、これに対する答えはいくつかの場所にある必要があると思います. 残念ながら、私が達成しようとしていることを正確に把握することはできません。
スタッフメンバーにそれぞれ割り当てられているユーザーグループのリストがあります。これは、ユーザー グループのリストを反復処理し、各グループの横に利用可能なスタッフ メンバーのドロップダウンを表示することによって行われます。スタッフ メンバーを割り当てないことも可能であるため、null 値の選択オプションを使用できる必要があります。
新しいグループが作成されている場合、デフォルトとして null 値を使用しても問題ありませんが、既存のレコードを更新するだけの場合は、ドロップダウンをデフォルトで、スタッフ メンバー ID が一致するオプションに設定したいと考えています。
そこで、利用可能なスタッフ メンバーを照会します。
var rtrnStaff = (from st in db.PrmTbl_Staffs
join sal in db.PrmTbl_Salutations on st.SalutationID equals sal.ID
where st.Active == true
select new { st.ID, Name = sal.Desc + ". " + st.Name });
この配列に空白の値を挿入するには:
List<SelectListItem> staff = new SelectList(rtrnStaff, "ID", "Name").ToList();
staff.Insert(0, (new SelectListItem { Text = "None", Value = "0" })); //can value be = null?
私の見解では、フォームで新しいユーザー グループを作成するには、次のようなドロップダウンを提供できます。
@Html.DropDownList( "staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"])
これにより、ドロップダウンが表示され、最初に「なし」オプションが表示されますが、これで問題ありません。ただし、デフォルト値の引数を追加して更新フォームに同じことをしようとすると、機能しません。
@Html.DropDownList( "staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], item.StaffID)
foreach ループ内に配置すると、関連する staffID に一致するオプションがデフォルトとして表示されるという意図があります。代わりに、「なし」が最初のオプションです。
コントローラーでテーブルをクエリするだけで、そこに選択リストを作成するのではなく、ViewData を介して直接結果をビューに渡し、ビューで次の操作を行います。
@Html.DropDownList("staffID", new SelectList(
(System.Collections.IEnumerable) ViewData["Staff"], "ID", "Name", item.StaffID),
new { Name = "staffID" })
それは問題なく機能しますが、「なし」オプションはありません。明らかに、私には妥協点が必要です!DropDownList、DropDownListFor、List、SelectList などの間で混乱しています。
編集
(コードの現在の状態を表示するため)
コントローラー:
var rtrnStaff = (from st in db.PrmTbl_Staffs
join sal in db.PrmTbl_Salutations on st.SalutationID equals sal.ID
where st.Active == true
select new { st.ID, Name = sal.Desc + ". " + st.Name });
List<SelectListItem> staff = new SelectList(rtrnStaff, "ID", "Name").ToList();
ViewData["StaffwNull"] = staff;
意見:
//show dropdown of all staff,
//defaulting to "None" value (works)
@Html.DropDownList("staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], "None")
//show dropdown of all staff,
//defaulting to value matching item.staffID (doesn't work)
//default selection is first list item
//and list doesnt include "None" option
@foreach (var item in Model)
{
...
var thisStaffID = item.StaffID;
....
@Html.DropDownList( "staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], thisStaffID)
}