.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
相关产品推荐
相关产品推荐

