Umbraco 12 Surface 控制器 POST 方法 - 无法点击控制器操作

问题描述 投票:0回答:1

我对 Umbraco 很陌生,正在使用 Umbraco 12。我有一个表面控制器,它有几个 Get 端点,当通过 Postman 发送请求时可以工作,还有一个 Post 端点,我不断地收到 400 错误请求。

下面的代码是控制器的精简版

[Controller]
public class EventsController : SurfaceController
{
    private readonly IPublishedContentQuery _contentQuery;

    public EventsController(
        IUmbracoContextAccessor umbracoContextAccessor,
        IUmbracoDatabaseFactory databaseFactory,
        ServiceContext services, AppCaches appCaches,
        IProfilingLogger profilingLogger,
        IPublishedUrlProvider publishedUrlProvider,
        IPublishedContentQuery contentQuery)
        : base(umbracoContextAccessor,
            databaseFactory,
            services,
            appCaches,
            profilingLogger,
            publishedUrlProvider)
    {
        _contentQuery = contentQuery;
    }

    [HttpGet]
    public IActionResult GetPlacements(int year, string titleEvent)
    {
        // Redacted - Can hit when going to its url
        https://localhost:44322/umbraco/surface/events/GetPlacements
    }

    [HttpPost]
    public IActionResult PostPlacement(string teamName, string iso3, string finalPlacement, string titleEvent, string eventYear)
    {
        var rootContent = _contentQuery.ContentAtRoot().ToList();
        var placementItems = rootContent.FirstOrDefault(x => x.Name == "Data")!.Children.FirstOrDefault(x => x.Name == "Event Placements");

        // redacted - Cannot hit when going to its url
        // https://localhost:44322/umbraco/surface/events/PostPlacement 

        return Ok();
    }
}

我环顾四周,发现我需要将其作为表单数据或 x-www-form-urlencoded 发送

我所看到的问题

  1. 我对 Umbraco 没有太多经验,所以我可能错过了一些非常明显的东西。
  2. 我还没有添加验证器,所以不确定为什么我收到 400 错误请求
  3. 我已经尝试在方法中添加[FromForm]到参数中,但仍然不起作用
  4. 我还没有尝试将其绑定到模型
  5. 我尝试添加路线,但随后收到 404
  6. 我也看到了这个 Umbraco 表面控制器未使用 POST 提交到后端,并且正在同时尝试此操作,但仍然没有运气。

需要这个端点将从外部系统发送数据,然后我有一个正在被点击的视图,然后它将显示数据(该位确实有效)。

umbraco .net-7.0 umbraco12
1个回答
0
投票

需要考虑的不同点

  1. 直接回答:用
    [Http, IgnoreAntiforgeryToken]
    属性装饰你的操作方法,它应该可以工作(随时通知我)。

为什么

  1. SurfaceControllers
    是非常特殊的控制器,与 Umbraco 的行为密切相关。所以,他们有特殊的行为。很多事情都是在幕后为你做的。在这种情况下,默认情况下,它们被设计为与包含防伪令牌的 HTML 表单一起使用。

在 Umbraco 文档 (https://docs.umbraco.com/umbraco-cms/reference/routing/surface-controllers/) 中,当您阅读:

用于与 Umbraco 前端(不是后台)交互

您必须明白:“用于与 UMBRACO 生成的页面(内容)进行交互并使用 UMBRACO 的一些功能(不是后台)”

在这种情况下,您的控制器有一个

this.UmbracoContext.PublishedRequest
属性,其中包含调用页面的
IPublishedContent

  1. 关于您的需要

这样做的需要是该端点将从以下位置发送数据 外部系统

该文档应包含

SurfaceControllers
并非旨在创建 API(应用程序 2 应用程序)。 它们是为页面(内容)2
SurfaceController
API
设计的。

当您使用 A2A API 的表面控制器时,

this.UmbracoContext.PublishedRequest
属性为
null
(许多其他功能不起作用)。

创建真正的 A2A API(REST 或非 REST):

  • 创建基本的 ASP Net 控制器
  • 使用依赖注入来获取您的服务(并非所有服务都可用:您不在页面调用的上下文中)。
  • 根据您的 Umbraco 版本,您可能需要设置自定义路线。
© www.soinside.com 2019 - 2024. All rights reserved.