You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:30:56