在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
相关产品推荐
相关产品推荐

