ASP.NET MVC迁移Core时ViewContext无Controller属性的替代方案咨询
ASP.NET Core MVC 替代原ViewContext.Controller取值的解决方案
原代码的核心逻辑是从当前请求的控制器实例中获取自定义基类EMPBaseController的CurrentRegisteredCulture属性,ASP.NET Core 中ViewContext移除了Controller属性,可通过以下几种方法实现完全相同的效果:
方案1:基类控制器注入ViewData(最推荐)
该方案符合ASP.NET Core的最佳实践,无需向视图暴露整个控制器实例,性能最优、耦合度最低:
- 第一步:修改自定义基类
EMPBaseController,重写OnActionExecuting方法,提前将目标属性存入ViewData
public class EMPBaseController : Controller { // 原有CurrentRegisteredCulture属性保持不变 public Culture CurrentRegisteredCulture { get; set; } public override void OnActionExecuting(ActionExecutingContext context) { base.OnActionExecuting(context); ViewData[nameof(CurrentRegisteredCulture)] = CurrentRegisteredCulture; } }
- 第二步:Razor视图中直接从ViewData取值即可
Culture CurrentRegisteredCulture = ViewData[nameof(CurrentRegisteredCulture)] as Culture;
方案2:存储控制器实例到HttpContext.Items(适合需要访问多个控制器属性的场景)
如果你需要在视图中访问EMPBaseController的多个属性,不想逐个存入ViewData,可以直接把控制器实例存入请求上下文:
- 第一步:在
EMPBaseController的OnActionExecuting方法中存入当前控制器实例
public override void OnActionExecuting(ActionExecutingContext context) { base.OnActionExecuting(context); HttpContext.Items["CurrentEMPBaseController"] = this; }
- 第二步:Razor视图中从HttpContext.Items取出实例后读取属性
Culture CurrentRegisteredCulture = (HttpContext.Items["CurrentEMPBaseController"] as EMPBaseController)?.CurrentRegisteredCulture;
方案3:视图注入IHttpContextAccessor(适合无基类修改权限的场景)
如果你暂时没有修改EMPBaseController的权限,可以通过全局过滤器+视图注入的方式实现:
- 第一步:在
Program.cs中注册IHttpContextAccessor服务和全局Action过滤器
// 注册HttpContext访问服务 builder.Services.AddHttpContextAccessor(); // 注册全局过滤器,存入控制器实例 builder.Services.AddControllersWithViews(options => { options.Filters.Add<StoreControllerInstanceFilter>(); });
- 第二步:实现全局过滤器
StoreControllerInstanceFilter
public class StoreControllerInstanceFilter : IActionFilter { public void OnActionExecuting(ActionExecutingContext context) { if (context.Controller is EMPBaseController empController) { context.HttpContext.Items["CurrentEMPBaseController"] = empController; } } public void OnActionExecuted(ActionExecutedContext context) {} }
- 第三步:Razor视图顶部注入IHttpContextAccessor后取值
@inject IHttpContextAccessor _httpContextAccessor @{ var controller = _httpContextAccessor.HttpContext?.Items["CurrentEMPBaseController"] as EMPBaseController; Culture CurrentRegisteredCulture = controller?.CurrentRegisteredCulture; }
内容的提问来源于stack exchange,提问作者Imran Ahmad Mughal
相关产品推荐
相关产品推荐

