Umbraco中将代码提取至Partial后报错问题求助
解决Umbraco Partial视图遍历员工数据的报错问题
嘿,我来帮你搞定这个Umbraco的问题!你猜的没错,问题确实出在CurrentPage.Employee的使用方式上,咱们一步步来解决:
问题根源
CurrentPage是Umbraco旧版的动态上下文对象,它完全依赖当前请求的页面上下文才能正确工作。当你把循环逻辑抽成Partial视图后,Partial的运行上下文可能和原页面不一致,再加上动态类型本身就容易出现类型匹配、上下文丢失的问题,这就是报错的核心原因。
推荐解决方案:使用强类型模型传递数据
1. 修改Partial视图,接收强类型参数
把Partial改成接收员工集合的强类型模型,让它不依赖页面上下文,只依赖传入的数据,稳定性会大幅提升。假设你的员工是Umbraco标准的IPublishedContent类型,Partial代码调整如下:
@model IEnumerable<IPublishedContent> @foreach (var employee in Model) { <!-- 保留你原来的图片逻辑,改用强类型取值方式 --> var employeeImageId = employee.Value<int>("employeeImage"); // 假设图片字段是媒体选取器,存储ID var imageItem = Umbraco.Media(employeeImageId); var imageUrl = imageItem?.Url ?? ""; var employeeName = employee.Value<string>("employeeName"); <img src="@imageUrl" alt="@employeeName" /> <!-- 其他复杂的员工内容渲染逻辑 --> }
2. 在About Us页面视图中传递正确的员工集合
根据你的员工数据存储方式,选择对应的获取逻辑,再把集合传给Partial:
- 如果员工是当前页面的子节点(比如你创建了
Employee文档类型,作为About Us的子节点):@{ // 筛选出所有类型为Employee的子节点,替换成你的文档类型别名 var employees = Model.Children.Where(x => x.ContentType.Alias.Equals("employee", StringComparison.OrdinalIgnoreCase)); } <!-- 渲染Partial并传入员工集合 --> @Html.Partial("~/Views/Partials/你的Partial名称.cshtml", employees) - 如果员工是当前页面的内容选取器字段(比如页面上有个多选的内容选取器字段,别名是
employee):@{ var employees = Model.Value<IEnumerable<IPublishedContent>>("employee"); } @Html.Partial("~/Views/Partials/你的Partial名称.cshtml", employees)
临时过渡方案(不推荐长期使用)
如果暂时不想切换强类型,也可以在原页面把动态的员工集合直接传给Partial:
Partial视图代码:
@model dynamic @foreach (var employee in Model) { <img src="@Umbraco.Media(employee.employeeImage).Url" alt="@employee.employeeName" /> <!-- 其他逻辑 --> }
页面视图调用:
@Html.Partial("~/Views/Partials/你的Partial名称.cshtml", CurrentPage.Employee)
不过还是建议尽快切换强类型,因为Umbraco 8及以后的版本更推荐强类型开发,能避免很多动态类型带来的隐性错误,还能获得IDE的智能提示。
内容的提问来源于stack exchange,提问作者Georges Legros
相关产品推荐
相关产品推荐

