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

.NET 6 MVC中调用API并向View传数据的方案咨询

ASP.NET MVC调用API及数据传递方案

一、是否可通过ASP.NET MVC调用API?

完全可以,ASP.NET MVC原生支持调用外部API并将数据传递至View展示,你现有的BannerService已经实现了API调用的核心逻辑,仅需调整数据传递到View的流程即可。

二、优化后的API调用与数据传递方法

1. 依赖注入改造BannerService

当前代码中serviceUrl采用静态字段的方式不够灵活,建议通过依赖注入获取配置,并将服务注册到DI容器,提升可维护性与可测试性:

// Program.cs中注册服务
builder.Services.AddScoped<IBannerAPI, BannerService>();

// 改造后的BannerService
public class BannerService : IBannerAPI
{
    private readonly string _serviceUrl;

    public BannerService(IConfiguration configuration)
    {
        _serviceUrl = configuration.GetValue<string>("ServiceUrl")!;
    }

    public T CallAPI<T>(string method, Dictionary<string, string>? parameters)
    {
        try
        {
            var client = new RestClient(_serviceUrl);
            var request = new RestRequest(method, Method.Get);
            
            if (parameters != null)
            {
                foreach (var param in parameters)
                {
                    request.AddParameter(param.Key, param.Value);
                }
            }

            var response = client.Execute<T>(request);
            // 利用RestSharp自带的反序列化,无需手动调用JsonConvert
            if (response.IsSuccessful)
            {
                return response.Data!;
            }
            else
            {
                LogManager.LogError($"API调用失败:{response.ErrorMessage}");
                return default(T)!;
            }
        }
        catch (Exception e)
        {
            LogManager.LogException(e);
            return default(T)!;
        }
    }

    public List<BannerModel> GetBanner()
    {
        return CallAPI<List<BannerModel>>("GetBanner", null);
    }
}

2. Controller中传递数据到View

在MVC Controller中注入IBannerAPI,调用接口获取数据后,可通过三种方式传递至View:

方式一:强类型Model(推荐)

强类型Model类型安全,便于维护:

public class HomeController : Controller
{
    private readonly IBannerAPI _bannerService;

    public HomeController(IBannerAPI bannerService)
    {
        _bannerService = bannerService;
    }

    public IActionResult Index()
    {
        var banners = _bannerService.GetBanner();
        return View(banners);
    }
}

对应的View(Index.cshtml):

@model List<BannerModel>

<h1>Banner列表</h1>
@if (Model != null && Model.Any())
{
    foreach (var banner in Model)
    {
        <div class="banner-item">
            <h3>@banner.TieuDeBanner</h3>
            <img src="@banner.HinhAnhBanner" alt="@banner.TieuDeBanner" />
            <p>创建时间:@banner.NgayTao</p>
        </div>
    }
}
else
{
    <p>暂无Banner数据</p>
}

方式二:ViewBag传递

ViewBag是动态类型,适合简单场景:

public IActionResult Index()
{
    var banners = _bannerService.GetBanner();
    ViewBag.Banners = banners;
    return View();
}

对应的View:

<h1>Banner列表</h1>
@{
    var banners = ViewBag.Banners as List<BannerModel>;
}
@if (banners != null && banners.Any())
{
    foreach (var banner in banners)
    {
        <div class="banner-item">
            <h3>@banner.TieuDeBanner</h3>
            <img src="@banner.HinhAnhBanner" alt="@banner.TieuDeBanner" />
            <p>创建时间:@banner.NgayTao</p>
        </div>
    }
}
else
{
    <p>暂无Banner数据</p>
}

方式三:ViewData传递

ViewData是字典类型,与ViewBag功能类似:

public IActionResult Index()
{
    var banners = _bannerService.GetBanner();
    ViewData["Banners"] = banners;
    return View();
}

对应的View:

<h1>Banner列表</h1>
@{
    var banners = ViewData["Banners"] as List<BannerModel>;
}
@if (banners != null && banners.Any())
{
    foreach (var banner in banners)
    {
        <div class="banner-item">
            <h3>@banner.TieuDeBanner</h3>
            <img src="@banner.HinhAnhBanner" alt="@banner.TieuDeBanner" />
            <p>创建时间:@banner.NgayTao</p>
        </div>
    }
}
else
{
    <p>暂无Banner数据</p>
}

3. 异步调用优化(可选)

为避免阻塞请求线程,建议将API调用改为异步方式,提升应用性能:

// 修改IBannerAPI接口
public interface IBannerAPI
{
    Task<List<BannerModel>> GetBannerAsync();
}

// 改造BannerService的异步方法
public async Task<T> CallAPIAsync<T>(string method, Dictionary<string, string>? parameters)
{
    try
    {
        var client = new RestClient(_serviceUrl);
        var request = new RestRequest(method, Method.Get);
        
        if (parameters != null)
        {
            foreach (var param in parameters)
            {
                request.AddParameter(param.Key, param.Value);
            }
        }

        var response = await client.ExecuteAsync<T>(request);
        if (response.IsSuccessful)
        {
            return response.Data!;
        }
        else
        {
            LogManager.LogError($"API调用失败:{response.ErrorMessage}");
            return default(T)!;
        }
    }
    catch (Exception e)
    {
        LogManager.LogException(e);
        return default(T)!;
    }
}

public async Task<List<BannerModel>> GetBannerAsync()
{
    return await CallAPIAsync<List<BannerModel>>("GetBanner", null);
}

// Controller中异步调用
public async Task<IActionResult> Index()
{
    var banners = await _bannerService.GetBannerAsync();
    return View(banners);
}

内容的提问来源于stack exchange,提问作者Nguyễn Lê Nguyễn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:50:34