MVCのドロップダウンリスト...基本的に私の存在の悩みの種...
この正確な問題について多くのトピックを見てきましたが、ここやインターネットで見つけたすべてが私の問題を解決していません.
最初に少し背景を説明します。ユーザーがレコードを編集できるページがあります。編集ページのこれらのフィールドの 1 つは、クライアントで満たされたドロップダウン リストです。編集ページにアクセスするには、レコードのテーブルが表示された別のページから編集リンクをクリックします。編集ページに到達すると、選択したレコードから編集する情報がフォームに取り込まれます。ログイン画面に加えて、これはおそらく、データを移動するすべての Web サイトにとって最も基本的で一般的な機能の 1 つです。
したがって、ビューのコードは次のとおりです。
@Html.DropDownList("ClientsDropdown", (IEnumerable<SelectListItem>)ViewBag.ClientsDropdown, "Select a Client")
コントローラーのコードは次のとおりです。
[HttpGet]
public ViewResult Details(int id, int pageNumber = 1)
{
Invoice invoice = db.Invoices.Find(id);
FillClientDropdown(invoice);
var model = new InvoiceDetailsModel() { Invoice = invoice, PageNumber = pageNumber };
return View(model);
}
そして FillClientDropdown(invoice) 呼び出し:
private void FillClientDropdown(Invoice invoice)
{
var clientList = db
.Clients
.OrderBy(x => x.Name)
.ToList()
.Select(x => new SelectListItem
{
Selected = (x.ID == invoice.ClientOcrStringID),
Text = x.Name,
Value = x.ID.ToString()
});
ViewBag.ClientsDropdown = new SelectList(clientList, "Value", "Text", "Selected");
}
clientList が実際にデータベースから適切なクライアント リストを取得していること、および適切な SelectListItem の「選択済み」属性が True に設定されていることを確認しました。
しかし、ページを読み込んでドロップダウンリストを検査すると、次のようになります。
<select id="ClientsDropdown" name="ClientsDropdown">
<option value="">Select a Client</option>
<option value="1">Test Client 1</option>
<option value="2">Test Client 2</option>
新しい SelectList を作成すると、各オプションに Selected="something" 値も追加されると思いましたが、そうではないようです。
Web フォームを使用できた場合、約 3 分でこれを実行できたことを知るのはかなりイライラするので、この問題に関する助けをいただければ幸いです...
アップデート
うまくいったようです!
これが私がしたことです: 私はすでに InvoiceDetailsModel を使用していたので、追加しました:
public SelectList ClientList { get; set; }
次に、InvoiceController で、詳細を少し変更しました。
[HttpGet]
public ViewResult Details(int id, int pageNumber = 1)
{
Invoice invoice = db.Invoices.Find(id);
var clientList = db
.Clients
.OrderBy(x => x.Name)
.ToList()
.Select(x => new SelectListItem
{
Text = x.Name,
Value = x.ID.ToString()
});
var model = new InvoiceDetailsModel() { Invoice = invoice, PageNumber = pageNumber };
model.ClientList = new SelectList(clientList, "Value", "Text", model.Invoice.ClientOcrStringID);
return View(model);
}
InvoiceDetailsModel への追加機能を利用するため。最後に、私の見解では、ドロップダウンを次のように変更しました。
@Html.DropDownListFor(model => model.Invoice.ClientOcrStringID, Model.ClientList, "Select a Client")
これが誰かに役立つことを願っています...将来的には誰でも。