首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET MVC DropDownListFor 設定預設選中項完整指南:三種實戰模式

     編輯:ASP.NET 基礎

核心機制

DropDownListFor 依賴 List<SelectListItem> 做為資料來源,每個 SelectListItem 擁有 Text(顯示文字)、Value(提交值)、Selected(是否預設選中)三屬性。**關鍵在於:在 Controller 端根據 Model 資料,將對應項目的 Selected = true,再透過 ViewBag/ViewData/Model 傳遞至 View。**

模式一:Controller 端遍歷設定(最通用、零侵入 Model)

適用場景

  • 下拉選單資料來源固定(如字典表、枚舉)。
  • 不想污染 Domain Model / ViewModel。

Controller 實作

public ActionResult Edit(int id)
{
    // 1. 取得領域模型(含需綁定的屬性值)
    var domain = _service.GetById(id); // 假設 domain.CategoryId = 3

    // 2. 取得下拉選單原始資料
    var items = _dictService.GetCategoryItems(); // 回傳 List

    // 3. 遍歷比對,設定 Selected
    foreach (var item in items)
    {
        item.Selected = item.Value == domain.CategoryId.ToString();
    }

    // 4. 傳遞至 View
    ViewBag.Categories = items;
    return View(domain);
}

View 實作

@model DomainModel
@Html.DropDownListFor(m => m.CategoryId, (List)ViewBag.Categories, "== 請選擇 ==")

模式二:ViewModel 內建 IsSelected(乾淨、強型別、利於測試)

適用場景

  • 下拉選單資料動態、需攜帶額外中繼資料(如停用狀態、圖示)。
  • 追求 ViewModel 自包含,Controller 不處理 UI 邏輯。

ViewModel 定義

public class DepartmentOption
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsSelected { get; set; } // UI 狀態
    public bool IsDisabled { get; set; } // 擴充:是否停用
}

Controller 組裝

public ActionResult Index()
{
    var currentDeptId = GetCurrentUserDeptId(); // 來源:Session、Claim、QueryString...

    var options = _db.Departments
        .Select(d => new DepartmentOption
        {
            Id = d.Id,
            Name = d.Name,
            IsSelected = d.Id == currentDeptId,
            IsDisabled = d.IsArchived
        })
        .ToList();

    // 轉為 SelectListItem(可寫成擴充方法)
    var items = options.Select(o => new SelectListItem
    {
        Text = o.Name,
        Value = o.Id.ToString(),
        Selected = o.IsSelected,
        Disabled = o.IsDisabled
    }).ToList();

    ViewBag.Departments = items;
    return View();
}

模式三:SelectList 建構子直接指定 selectedValue(最簡潔)

適用場景

  • 資料來源為簡單實體集合,無需額外 UI 邏輯。
  • 偏好一行程式碼完成綁定。

Controller

public ActionResult Index(string selectedId) // 來自 QueryString 或 PostBack
{
    var projects = _repo.GetAllProjects(); // List { Id, Name }

    // SelectList 建構子:(items, dataValueField, dataTextField, selectedValue)
    ViewBag.Projects = new SelectList(projects, "Id", "Name", selectedId);

    return View();
}

View

@using (Html.BeginForm())
{
    @Html.DropDownList("ProjectId", ViewBag.Projects as SelectList, "== 請選擇 ==")
    
}

進階技巧與避坑指南

1. 多選下拉框

// Model
public int[] SelectedCategoryIds { get; set; }

// View
@Html.ListBoxFor(m => m.SelectedCategoryIds, (MultiSelectList)ViewBag.Categories)

// Controller
ViewBag.Categories = new MultiSelectList(items, "Value", "Text", model.SelectedCategoryIds);

2. 選項分組

var groups = items
    .GroupBy(i => i.GroupName)
    .Select(g => new SelectListGroup { Name = g.Key })
    .ToList();

foreach (var item in items)
    item.Group = groups.First(g => g.Name == item.GroupName);

3. 常見錯誤

錯誤現象原因修正
下拉框永遠顯示第一項Selected 全為 false,且 Model 屬性為 null/0確保 Model 屬性有值,或在 Controller 明確設定 Selected = true
PostBack 後選中項消失Controller 未重新設定 Selected 就回傳 ViewPost 回傳前重新組裝 ViewBag,或使用 ModelState 自動綁定
驗證失敗時下拉框資料消失return View(model) 時未重新填充 ViewBag抽取 PopulateDropdowns(model) 方法,GET/POST 共用

總結選型建議

場景推薦模式理由
靜態字典/枚舉、零商業邏輯模式三程式碼最少、可讀性最高
動態資料、需比對 Domain Model模式一不污染 Model、Controller 掌控權清晰
複雜 UI 狀態(停用、分組、圖示)模式二ViewModel 自描述、易單元測試、前後端分離友善
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved