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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:06:04