You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用ViewBag在MVC视图中传递List<SelectListItem>填充DDL的问题

解决MVC视图不使用ViewBag访问下拉列表数据的问题

嘿,我来帮你搞定这个问题~你现在的核心问题是:控制器里创建的Items列表只是个局部变量,根本没传递到视图的上下文环境中,所以视图完全“看不到”它。下面给你两个不用ViewBag的可行方案:

方案一:使用强类型视图模型(推荐)

这种方式更符合MVC的设计思想,类型安全还方便维护:

  1. 先创建一个视图模型类,专门用来传递视图需要的数据:
public class ItemViewModel
{
    // 存储下拉列表选项
    public List<SelectListItem> Items { get; set; }
    // 可选:如果需要绑定选中的项,添加这个属性
    public int? SelectedItemId { get; set; }
}
  1. 修改控制器代码,实例化视图模型并赋值,再传递给视图:
public ActionResult Name() 
{
    var viewModel = new ItemViewModel();
    // 假设Model是你的数据模型实例,获取下拉列表数据
    viewModel.Items = Model.GetItemList();
    // 将视图模型传给视图
    return View("Name", viewModel);
}
  1. 在视图顶部声明强类型模型,之后就能直接访问Model.Items了:
@model 你的命名空间.ItemViewModel

<!-- 生成下拉列表,绑定SelectedItemId作为选中值,最后参数是默认提示文本 -->
@Html.DropDownListFor(m => m.SelectedItemId, Model.Items, "请选择一项", new { @class = "form-control" })

方案二:使用ViewData传递

如果不想创建视图模型,也可以用ViewData来传递数据(和ViewBag本质类似,但用键值对形式,避免动态类型):

  1. 修改控制器,把Items存入ViewData:
public ActionResult Name() 
{
    List<SelectListItem> Items = Model.GetItemList();
    // 用一个键名存储列表,比如"ItemList"
    ViewData["ItemList"] = Items;
    return View("Name");
}
  1. 在视图里通过键名取出列表,注意要强制类型转换:
<!-- 第一个参数是选中值的存储键,第二个是下拉列表选项,最后是默认提示 -->
@Html.DropDownList("SelectedItem", (List<SelectListItem>)ViewData["ItemList"], "请选择一项", new { @class = "form-control" })

简单总结下:你之前的代码只是在控制器里生成了列表,但没把它“递”给视图,所以视图根本访问不到。上面两种方式都能解决这个问题,优先选强类型视图模型的方式哦~

内容的提问来源于stack exchange,提问作者Borges

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:35:10