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

在Razor中用for循环填充DropDownList报错‘} expected’的问题咨询

解决Razor中用for循环填充DropDownListFor的语法错误及最佳实践

首先,你遇到的} expected错误,核心原因是C#的集合初始化器(new List<SelectListItem> { ... })内部不允许直接嵌入for循环语句。集合初始化语法只能直接罗列元素或调用Add方法,没法直接写循环逻辑,这就是为什么你检查括号都对但还是报错的原因。

视图内的修正方案(可行但非最佳)

如果一定要在Razor视图里完成这个逻辑,你需要先单独构建SelectListItem列表,再传给DropDownListFor,代码如下:

@{
    int currentYear = DateTime.Now.Year;
    var yearOptions = new List<SelectListItem>();
    
    for (var i = 0; i < 10; i++)
    {
        var targetYear = currentYear - i;
        yearOptions.Add(new SelectListItem
        {
            Text = targetYear.ToString(),
            Value = targetYear.ToString(),
            Selected = targetYear == currentYear // 默认选中当前年份
        });
    }
}

@Html.DropDownListFor(model => model.ResolutionYear, yearOptions)

这样先把循环逻辑单独抽出来构建列表,再把准备好的列表传给HtmlHelper方法,就符合语法要求了。

推荐的最佳实践:控制器中准备数据

你提到“这种做法并非最佳实践”是完全正确的。MVC的设计原则是控制器负责准备数据,视图只负责展示,把数据构建逻辑放在控制器里会让代码更易维护、测试。

控制器端实现

public ActionResult YourActionName()
{
    int currentYear = DateTime.Now.Year;
    // 生成近10年的选项(当前年往前推9年)
    var yearOptions = Enumerable.Range(currentYear - 9, 10)
                                .Reverse() // 反转后让当前年份排在最前面
                                .Select(year => new SelectListItem
                                {
                                    Text = year.ToString(),
                                    Value = year.ToString(),
                                    Selected = year == currentYear
                                })
                                .ToList();

    // 推荐用ViewModel传递数据(更类型安全)
    var yourViewModel = new YourViewModel();
    yourViewModel.ResolutionYearOptions = yearOptions;
    
    return View(yourViewModel);

    // 也可以用ViewBag临时传递(不推荐大型项目)
    // ViewBag.ResolutionYearOptions = yearOptions;
    // return View();
}

视图端调用

如果用ViewModel:

@Html.DropDownListFor(model => model.ResolutionYear, Model.ResolutionYearOptions)

如果用ViewBag:

@Html.DropDownListFor(model => model.ResolutionYear, (List<SelectListItem>)ViewBag.ResolutionYearOptions)

这样既避免了视图里的逻辑混乱,也让数据准备的逻辑更易于测试和复用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:19:43