Umbraco模板创建遇模型类型不匹配错误求助
你遇到的是Umbraco里很常见的视图模型与动态代理类型不兼容问题,我来帮你拆解根源和解决办法:
问题本质
Umbraco处理文档类型时,会通过Castle动态代理生成对应DTO的代理类(就是错误里的Castle.Proxies.StandardChildDTProxy),但你的视图明确要求接收TSW.Web.ViewModels.StandardChildVM类型的模型。这说明你没有把Umbraco生成的DTO(或其代理类)正确转换为自定义ViewModel,就直接传给视图了。
具体解决步骤
确认视图的模型声明
先检查新视图顶部的@model指令是否正确指向你的自定义ViewModel:@model TSW.Web.ViewModels.StandardChildVM别不小心写成了文档类型的DTO(比如
StandardChildDT)。在控制器中完成DTO到ViewModel的映射
对应的RenderMvcController里,你需要把Umbraco传递的文档类型DTO(包括代理类)转换成ViewModel,同时排除不需要的HTML条目。示例代码如下:public class StandardChildController : RenderMvcController { public override ActionResult Index(ContentModel model) { // 转换为对应的文档类型DTO var dto = model.Content as StandardChildDT; if (dto == null) return base.Index(model); // 实例化ViewModel,只映射需要的属性,跳过要排除的HTML条目 var viewModel = new StandardChildVM { Title = dto.Title, Summary = dto.Summary, // 这里不添加你想排除的HTML属性 }; return View(viewModel); } }如果用AutoMapper这类工具,记得配置映射规则时忽略不需要的属性:
CreateMap<StandardChildDT, StandardChildVM>() .ForMember(vm => vm.UnwantedHtmlProperty, opt => opt.Ignore());验证模板与控制器的关联
确保新模板关联到了上述自定义的RenderMvcController,而不是Umbraco默认的直接绑定文档类型的逻辑。可以在Umbraco后台「设置」→「模板」里检查模板的控制器关联配置。清理缓存并重新生成
Umbraco的缓存经常会引发这类奇怪的类型问题:- 清理解决方案的
bin和obj文件夹,重新生成项目 - 重启Visual Studio
- 在Umbraco后台开发者工具中刷新缓存(访问
/umbraco/developer/refresh)
- 清理解决方案的
关键提醒
永远不要直接把Umbraco生成的文档类型DTO(或其代理类)传给期望自定义ViewModel的视图——两者类型不兼容,必须通过手动映射或工具完成转换,这也是分层架构中ViewModel的核心作用之一。
内容的提问来源于stack exchange,提问作者Paul Almond

