ASP.NET Core MVC中Razor页面如何调用控制器方法获取返回字符串并展示
首先说明你遇到的方法不可用的原因:
- ASP.NET Core 已废弃传统ASP.NET MVC中的
@Html.Action、@Html.RenderAction方法,旧版本教程的相关用法在Core环境中无法使用 @Html.ActionLink是生成超链接<a>标签的辅助方法,本身作用不是调用控制器方法获取返回值,所以会提示找不到对应函数
最优简化方案(仅获取登录用户名无需自定义逻辑)
如果你只是需要获取当前登录用户的用户名,不需要额外自定义处理逻辑,不需要调用控制器方法,Razor视图全局可直接访问框架自带的Identity属性:
@User.Identity?.Name
直接在布局页需要展示用户名的位置写入上述代码即可输出。
如果你的GetLoggedInuser方法包含其他自定义业务逻辑,可选择以下任意一种可行方案实现:
方案1:使用视图组件(官方推荐替代旧版Action的方案)
视图组件是ASP.NET Core专门用来替代原有Html.Action能力的实现,适合需要处理逻辑后输出部分视图内容的场景:
- 在项目中新建
ViewComponents目录,新增视图组件类:
public class LoggedInUserViewComponent : ViewComponent { public IViewComponentResult Invoke() { // 写入你原GetLoggedInuser方法中的业务逻辑 return Content("garse garsebro"); } }
- 在布局页中直接调用组件即可输出返回内容:
@await Component.InvokeAsync("LoggedInUser")
方案2:抽取公共服务注入Razor视图
适合逻辑通用、多处需要调用的场景:
- 定义公共服务接口与实现:
// 接口定义 public interface IUserService { string GetLoggedInUser(); } // 实现类 public class UserService : IUserService { public string GetLoggedInUser() { // 写入业务逻辑 return "garse garsebro"; } }
- 在
Program.cs中注册服务:
builder.Services.AddScoped<IUserService, UserService>();
- 在布局页顶部注入服务后直接调用:
@* 页面顶部注入服务 *@ @inject IUserService UserService @* 需要展示的位置直接调用方法 *@ @UserService.GetLoggedInUser()
方案3:AJAX异步调用控制器接口
适合需要异步刷新、不阻塞页面首次渲染的场景:
- 给控制器方法添加
[HttpGet]特性标记为可访问路由:
[HttpGet] public string GetLoggedInUser() { return "garse garsebro"; }
- 布局页中添加占位标签,通过JS请求接口获取内容:
<span id="loggedInUser"></span> <script> fetch('/Home/GetLoggedInUser') .then(response => response.text()) .then(userName => { document.getElementById('loggedInUser').innerText = userName; }) </script>
内容的提问来源于stack exchange,提问作者Grazosi
相关产品推荐
相关产品推荐

