Visual Studio更新后ASP.NET Core传递视图数据到局部视图报错
问题背景与现象
- 熟悉VB.NET,刚接触C#和ASP.NET Core
- 项目代码原本在Visual Studio 16.9中运行正常,升级到17.10后,传递内联视图数据到局部视图时出现怪异编译错误:双击错误提示跳转到对应代码后错误消失,但重新编译时错误再次出现,导致编译失败
- 问题代码示例:
<partial name="Productiegegevens_Cel" view-data='@new ViewDataDictionary(ViewData) { { "Spacing", "mb-1" }, { "Label", "Melk prijs (€/100kg)" }, { "Naam", "melk_prijs" }, { "Data", Model.Voerefficientie1.productiegegevens.melk_prijs.ToString("n2") }, { "Data_alt", Model.Voerefficientie2 != null ? Model.Voerefficientie2.productiegegevens.melk_prijs.ToString("n2") : null }, { "Append", @Model.Voerefficientie1.productiegegevens.melk_prijs_huidig.ToString("n2") } }' />
- 补充信息:单独创建ViewData对象再传递给局部视图可正常运行,但项目中存在大量上述内联写法;问题已在两台Windows 11电脑上重现
解答
写法合法性
这种内联初始化ViewDataDictionary并传递给局部视图的写法原本是合法的。ASP.NET Core Razor视图支持通过对象初始化器语法内联构建ViewDataDictionary实例,早期版本的Visual Studio Razor编译器能正确解析这种写法。
错误原因
这大概率是Visual Studio 17.10版本的Razor编译器/代码分析器出现了兼容性bug。新版本IDE升级时,Razor的语法解析逻辑可能发生了变化,对内联对象初始化器中的复杂表达式(比如三元运算符、嵌套模型属性访问)处理异常,导致编辑器和编译器的状态不一致——双击跳转后编辑器重新解析暂时修复了显示错误,但编译时仍会触发解析问题。
临时解决方案(减少代码修改量)
- 清理项目的
bin和obj目录,重启Visual Studio后重新编译,避免缓存引发的解析异常 - 在视图顶部显式添加命名空间引用:
@using Microsoft.AspNetCore.Mvc.ViewFeatures,确保ViewDataDictionary被正确识别 - 将复杂表达式提前赋值到局部变量,简化内联初始化器内容:
再修改局部视图调用:@{ var melkPrijs = Model.Voerefficientie1.productiegegevens.melk_prijs.ToString("n2"); var melkPrijsAlt = Model.Voerefficientie2 != null ? Model.Voerefficientie2.productiegegevens.melk_prijs.ToString("n2") : null; var melkPrijsHuidig = Model.Voerefficientie1.productiegegevens.melk_prijs_huidig.ToString("n2"); }<partial name="Productiegegevens_Cel" view-data='@new ViewDataDictionary(ViewData) { { "Spacing", "mb-1" }, { "Label", "Melk prijs (€/100kg)" }, { "Naam", "melk_prijs" }, { "Data", melkPrijs }, { "Data_alt", melkPrijsAlt }, { "Append", melkPrijsHuidig } }' /> - 升级到与VS 17.10兼容的最新ASP.NET Core SDK版本(VS 17.10对应.NET 8.0系列,优先安装最新补丁版)
长期解决方案
- 关注Visual Studio的后续更新补丁,微软大概率会在新版本中修复这个Razor解析bug
- 若项目允许,逐步将内联初始化写法统一改为提前创建
ViewDataDictionary对象的方式,降低对编译器复杂表达式解析的依赖
内容的提问来源于stack exchange,提问作者Erik van Engelen
相关产品推荐
相关产品推荐

