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

PHP开发者求教:如何在Umbraco中调用外部API并返回JSON至视图

作为从PHP/Laravel转投Umbraco+ASP.NET的开发者,我太懂这种“熟悉的思路突然不好使”的感觉了!别慌,我给你梳理一套清晰的实现路径,帮你快速把演出/赛事类API数据拉到Umbraco视图里:

在Umbraco中调用外部API并传递活动数据到视图的完整思路

1. 选对HTTP客户端(替代Guzzle)

ASP.NET官方标配的HttpClient就是Guzzle的直接替代,Umbraco基于ASP.NET构建,直接用它就行。重点:别手动new实例,用依赖注入获取,避免资源泄漏问题。

2. 把JSON映射成C#模型(类比Laravel的DTO)

先把API返回的演出/赛事JSON结构转换成C#类,就像你在Laravel里写DTO一样。比如:

public class EventDto
{
    public int Id { get; set; }
    public string Title { get; set; }
    public DateTime EventDate { get; set; }
    public string Description { get; set; }
    public string ImageUrl { get; set; }
    // 其他字段根据API返回的结构补充
}

偷懒小技巧:直接把API返回的JSON复制到Visual Studio里,右键选“粘贴特殊→粘贴JSON为类”,一键生成模型!

3. 封装API调用逻辑(类比Laravel的Service类)

为了代码解耦,把API调用单独封装成服务类,后续维护更方便:

// 先定义接口,方便后续做测试或替换实现
public interface IEventApiService
{
    Task<List<EventDto>> GetEventsAsync();
}

public class EventApiService : IEventApiService
{
    private readonly HttpClient _httpClient;

    // 通过构造函数注入HttpClient
    public EventApiService(HttpClient httpClient)
    {
        _httpClient = httpClient;
        // 提前设置API的基础地址
        _httpClient.BaseAddress = new Uri("https://你的API基础地址.com/");
    }

    public async Task<List<EventDto>> GetEventsAsync()
    {
        try
        {
            // 发送GET请求并自动反序列化JSON,和Guzzle的操作逻辑一致
            var response = await _httpClient.GetFromJsonAsync<List<EventDto>>("api/events");
            // 防止返回null,默认给空列表
            return response ?? new List<EventDto>();
        }
        catch (HttpRequestException ex)
        {
            // 用Umbraco自带的日志记录错误
            Umbraco.Core.Logging.Logger.Error(typeof(EventApiService), ex, "获取赛事/演出数据失败");
            return new List<EventDto>();
        }
    }
}

记得在Umbraco的Program.cs里注册这个服务:

builder.Services.AddHttpClient<IEventApiService, EventApiService>();

4. 在Umbraco中调用服务(两种常用方式)

方式一:Surface Controller(适合页面级数据获取)

Surface Controller是Umbraco处理前端请求的标准控制器,类比Laravel的页面控制器:

public class EventsSurfaceController : SurfaceController
{
    private readonly IEventApiService _eventApiService;

    public EventsSurfaceController(IEventApiService eventApiService, IUmbracoContextAccessor umbracoContextAccessor) 
        : base(umbracoContextAccessor)
    {
        _eventApiService = eventApiService;
    }

    public async Task<ActionResult> RenderEvents()
    {
        var events = await _eventApiService.GetEventsAsync();
        // 返回局部视图并传递数据
        return PartialView("~/Views/Partials/Events.cshtml", events);
    }
}

方式二:View Component(适合可复用组件)

如果想把活动列表做成全局可复用的组件,用View Component更灵活:

public class EventsViewComponent : ViewComponent
{
    private readonly IEventApiService _eventApiService;

    public EventsViewComponent(IEventApiService eventApiService)
    {
        _eventApiService = eventApiService;
    }

    public async Task<IViewComponentResult> InvokeAsync()
    {
        var events = await _eventApiService.GetEventsAsync();
        return View(events);
    }
}

对应的视图要放在Views/Shared/Components/Events/Default.cshtml路径下。

5. 在视图里渲染数据

不管用哪种方式,视图里用Razor语法渲染就行,和Blade逻辑类似:

@model List<EventDto>

<div class="events-container">
    @if (!Model.Any())
    {
        <p>暂无演出/赛事数据</p>
    }
    else
    {
        @foreach (var ev in Model)
        {
            <div class="event-card">
                <img src="@ev.ImageUrl" alt="@ev.Title" class="event-img">
                <h3>@ev.Title</h3>
                <p class="event-date">@ev.EventDate.ToString("yyyy-MM-dd HH:mm")</p>
                <p class="event-desc">@ev.Description</p>
            </div>
        }
    }
</div>
  • 如果用Surface Controller,在模板里这样调用:@Html.Action("RenderEvents", "EventsSurface")
  • 如果用View Component,这样调用:@await Component.InvokeAsync("Events")

6. 额外优化建议

  • 缓存数据:如果API数据不会实时更新,用IMemoryCache缓存响应结果,减少重复请求,类比Laravel的缓存机制。
  • 后台配置API地址:可以在Umbraco后台创建一个文档类型,添加“API地址”等字段,然后在服务里读取当前节点的属性,不用硬编码地址。
  • 异常友好提示:除了服务里的日志,视图里也要处理空数据的情况,给用户友好提示。

内容的提问来源于stack exchange,提问作者kamil1995b

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:50:52