Umbraco V7 Surface Controller迁移至V12的技术问题求助
Umbraco V12 Surface Controller 重构指南:IPublishedContent、CultureDictionary 访问及 Ajax 调用实现
1. IPublishedContent 访问问题解决
Umbraco V12 中 Surface Controller 的上下文传递逻辑有变化:
- 通过
Html.BeginUmbracoForm提交时,Umbraco 会自动携带当前页面上下文,可直接用CurrentPage属性获取IPublishedContent。 - Ajax 调用时,请求未经过页面路由上下文,
CurrentPage会为空。此时需手动传递当前页面 ID,再通过注入的IPublishedContentQuery查询内容:
public class MySurfaceController : SurfaceController { private readonly IPublishedContentQuery _publishedContentQuery; // 构造函数注入 IPublishedContentQuery public MySurfaceController(IPublishedContentQuery publishedContentQuery) { _publishedContentQuery = publishedContentQuery; } [HttpPost] public IActionResult MyAjaxAction(int currentPageId) { var currentPage = _publishedContentQuery.Content(currentPageId); if (currentPage == null) { return BadRequest("无效页面ID"); } // 业务逻辑处理 return Json(new { success = true, pageTitle = currentPage.Value<string>("pageTitle") }); } }
2. CultureDictionary 替代方案
Umbraco V12 中,原 V7 的 CultureDictionary 可通过注入 ICultureDictionary 替换,用法与旧版本一致:
private readonly ICultureDictionary _cultureDictionary; public MySurfaceController(IPublishedContentQuery publishedContentQuery, ICultureDictionary cultureDictionary) { _publishedContentQuery = publishedContentQuery; _cultureDictionary = cultureDictionary; } // 在 Action 中读取字典项 var errorMessage = _cultureDictionary["FormErrorMessage"];
若项目偏向 ASP.NET Core 原生本地化方案,也可注入 IStringLocalizer<MySurfaceController> 读取资源文件,但 ICultureDictionary 依然兼容 Umbraco 后台配置的字典项。
3. Ajax 调用正确实现方式
Ajax 调用需解决AntiForgeryToken 验证和上下文参数传递两个核心问题:
前端 JS 代码
// 获取页面内置的 AntiForgeryToken const token = document.querySelector('input[name="__RequestVerificationToken"]').value; const currentPageId = @Model.Id; // 从视图模型获取当前页面ID const culture = '@System.Globalization.CultureInfo.CurrentCulture.Name'; // 发起 Ajax 请求 fetch('/umbraco/surface/MySurface/MyAjaxAction', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'RequestVerificationToken': token }, body: `currentPageId=${currentPageId}&culture=${culture}` }) .then(response => response.json()) .then(data => { console.log(data); }) .catch(err => console.error('请求失败:', err));
后端 Action 配置
确保 Action 添加 [ValidateAntiForgeryToken] 特性,同时接收传递的参数:
[HttpPost] [ValidateAntiForgeryToken] public IActionResult MyAjaxAction(int currentPageId, string culture) { // 切换当前请求的文化(如果需要) System.Globalization.CultureInfo.CurrentCulture = new System.Globalization.CultureInfo(culture); System.Globalization.CultureInfo.CurrentUICulture = new System.Globalization.CultureInfo(culture); var currentPage = _publishedContentQuery.Content(currentPageId); var successMsg = _cultureDictionary["SubmitSuccess"]; return Json(new { success = true, message = successMsg, pageName = currentPage.Name }); }
关键注意事项
- Umbraco V12 的 Surface Controller 路由固定为
/umbraco/surface/{控制器名}/{Action名},控制器名需去掉末尾的Controller后缀(如MySurfaceController对应路由中的MySurface)。 - 若无需完整页面上下文,也可传递其他标识,但页面 ID 是最直接可靠的上下文传递方式。
内容的提问来源于stack exchange,提问作者furybg
相关产品推荐
相关产品推荐

