如何在不使用控制器基类的情况下为所有视图设置 ViewBag 属性?

2023-12-02

过去,我通过让所有控制器继承自公共基础控制器,以全局方式将常见属性(例如当前用户)粘贴到 ViewData/ViewBag 上。

这允许我在基本控制器上使用 IoC,而不仅仅是访问此类数据的全局共享。

我想知道是否有其他方法可以将此类代码插入到 MVC 管道中?


最好的方法是使用 ActionFilterAttribute。我将向您展示如何在 .Net Core 和 .Net Framework 中使用它。

.Net Core 2.1 和 3.1

public class ViewBagActionFilter : ActionFilterAttribute
{

    public ViewBagActionFilter(IOptions<Settings> settings){
        //DI will inject what you need here
    }

    public override void OnResultExecuting(ResultExecutingContext context)
    {
        // for razor pages
        if (context.Controller is PageModel)
        {
            var controller = context.Controller as PageModel;
            controller.ViewData.Add("Avatar", $"~/avatar/empty.png");
            // or
            controller.ViewBag.Avatar = $"~/avatar/empty.png";

            //also you have access to the httpcontext & route in controller.HttpContext & controller.RouteData
        }

        // for Razor Views
        if (context.Controller is Controller)
        {
            var controller = context.Controller as Controller;
            controller.ViewData.Add("Avatar", $"~/avatar/empty.png");
            // or
            controller.ViewBag.Avatar = $"~/avatar/empty.png";

            //also you have access to the httpcontext & route in controller.HttpContext & controller.RouteData
        }

        base.OnResultExecuting(context);
    }
}

然后你需要在你的startup.cs中注册它。

.Net核心3.1

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews(options => { 
        options.Filters.Add<Components.ViewBagActionFilter>();
    });
}

.Net核心2.1

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
        {
            options.Filters.Add<Configs.ViewBagActionFilter>();
        });
}

然后你就可以在所有视图和页面中使用它

@ViewData["Avatar"]
@ViewBag.Avatar

.Net 框架(ASP.NET MVC .Net 框架)

public class UserProfilePictureActionFilter : ActionFilterAttribute
{

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.Controller.ViewBag.IsAuthenticated = MembershipService.IsAuthenticated;
        filterContext.Controller.ViewBag.IsAdmin = MembershipService.IsAdmin;

        var userProfile = MembershipService.GetCurrentUserProfile();
        if (userProfile != null)
        {
            filterContext.Controller.ViewBag.Avatar = userProfile.Picture;
        }
    }

}

在全局中注册您的自定义类。 asax(应用程序_启动)

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        GlobalFilters.Filters.Add(new UserProfilePictureActionFilter(), 0);

    }

然后你就可以在所有视图中使用它

@ViewBag.IsAdmin
@ViewBag.IsAuthenticated
@ViewBag.Avatar

另外还有一个办法

在 HtmlHelper 上创建扩展方法

[Extension()]
public string MyTest(System.Web.Mvc.HtmlHelper htmlHelper)
{
    return "This is a test";
}

然后你就可以在所有视图中使用它

@Html.MyTest()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用控制器基类的情况下为所有视图设置 ViewBag 属性? 的相关文章

随机推荐

  • 如何在Python极坐标中添加持续时间到日期时间

    我想在日期 时间中添加以秒为单位的持续时间 我的数据看起来像 import polars as pl df pl DataFrame dt 2022 12 14T00 00 00 2022 12 14T00 00 00 2022 12 14
  • Python 入门:属性错误

    我是 python 新手 今天刚刚下载 我正在使用它来处理网络蜘蛛 因此为了对其进行测试并确保一切正常 我下载了示例代码 不幸的是 它不起作用并给了我错误 AttributeError MyShell 对象没有属性 已加载 我不确定代码本身
  • 通过 VSTS CI/CD 升级 Azure Service Fabric 时出错

    我正在使用 VSTS 来设置 CI CD 以进行服务结构构建和部署 第一次部署没有错误 但第二次更新部署给出了以下错误 ConfigPackage中的内容名称 Config 版本 1 0 0 20180312 1 服务清单中的 Sample
  • 苹果手表上的图像

    昨天我的申请被拒绝时遇到了一个问题 显然 这些图像并未显示在实际的 Apple Watch 上 但它们显示在模拟器中 我什至尝试重置模拟器 但无法复制苹果员工发生的问题 所以我只是想知道在苹果手表上添加 显示图像的正确方法是什么 这样它们才
  • spring jpa hibernate 具有更多数据源

    我必须在我的应用程序 spring 中使用两个不同的数据库和 Hibernate Jpa 我想直接为不同的数据源定义不同的表 所以我使用两个不同的持久性单元并尝试使用
  • OpenTsdb:度量和标签信息中是否允许空格字符

    我正在使用 openTsdb 并遇到了度量 标记 tagk 甚至值 tagv 中不允许空格字符的问题 有什么方法可以至少在标签的值中添加空格吗 我还提到 http opentsdb net docs build html user guid
  • Angular 通用服务器端渲染、元标签

    我将网站移至 Angular 通用 SSR 在我搬家的过程中 我遇到了一些问题 我认为 ng universal 可以解决这些问题 我想添加元标记 例如描述 关键字等 每个页面不同 使用titleService正如 Angular 所建议的
  • Unity3d - eulerAngles(本地和全局)与检查器中的完全不同

    在游戏对象的检查器中 我使用的起始旋转是 90 但是当我运行时print transform eulerAngles x 我得到 270 同上transform localEulerAngles x 如果我倾斜gameObject向下 检查
  • Hibernate 创建冗余的多对多表

    在开发 Spring Boot 应用程序时 我必须删除数据库并让 Hibernate 再次生成它hibernate hbm2ddl auto update 之后 我想确保它按照我想要的方式执行所有操作 因此我调用 MySQL Workben
  • 从 url 加载图像

    我有一个图像网址 我想在 ImageView 中显示此 URL 中的图像 但我无法做到这一点 如何才能实现这一目标 如果您根据按钮单击加载图像 则上面接受的答案非常好 但是如果您在新活动中执行此操作 它会使 UI 冻结一两秒 环顾四周 我发
  • 单击后如何关闭此菜单

    我正在尝试定制这个菜单 这是 html 标记 ul class topnav li a href home Home a li li a href news News a li li a href contact Contact a li
  • 通过 multipart-HTML-Post 上传 pdf 确实会更改文件

    我尝试使用以下代码通过 vba 的多部分上传 pdf Public Function sap upload ByVal par objectID As String ByVal par description As String ByVal
  • 使用 Systemjs-builder 为 Angular2 应用程序创建多个包

    我有一个可用的 Angular2 应用程序 其结构如下 app components moduleA moduleB shared app module ts app routing ts app component ts main ts
  • 线程和同步方法

    我有以下代码 public class MyThread extends Thread private int i public static int sum 0 public MyThread int k i k public stati
  • 如何使用 XSLT 更新 XML 中的单个值?

    我有一个巨大的 XML 文件 我想在其中更新单个值 有没有一种方法可以编写 XSLT 文件 只需进行简单的更改即可生成现有 XML 文件的精确副本 例如 假设我有以下 XML 并且我想将员工 Martin 的职位编号更改为 100 我该如何
  • 单击按钮时翻转 div 的内容

    我正在学习翻转 div 内容的 3D 效果 悬停时 下面的 div 代码可以完美运行 但我想要的是 如果有人只点击按钮翻转 那么 div 的翻转应该可以工作 我只需要单击按钮时才需要这种翻转效果 而不是悬停或其他任何东西
  • EJB 应用程序中的 CORBA 异常

    我遇到了 EJB Glassfish 的问题 我正在开发一个客户端 服务器应用程序 其中客户端创建一个实体对象 并且必须将其发送到服务器应用程序 服务器应用程序必须将该实体保留在其数据库中 我选择使用会话 bean 与服务器进行通信 我已经
  • 通过 cron 执行 PHP - 未指定输入文件

    我使用以下命令通过 cron 执行 PHP 文件 php q home seilings public html dvd cron mailer php 问题是我有一个包含在执行中的文件 该文件确定要加载哪个配置 如下所示 if strst
  • 如何从 Python 内部在 Mac OS X 中截取屏幕截图:又名 Command-Control-Shift-4

    使用 Command Control Shift 4 可以截取屏幕截图区域 然后将其保存到剪贴板 我想知道 Python 内部是否也可以实现同样的功能 理想情况下 可以在 Python 中以编程方式指定图像文件格式以及保存位置 有任何想法吗
  • 如何在不使用控制器基类的情况下为所有视图设置 ViewBag 属性?

    过去 我通过让所有控制器继承自公共基础控制器 以全局方式将常见属性 例如当前用户 粘贴到 ViewData ViewBag 上 这允许我在基本控制器上使用 IoC 而不仅仅是访问此类数据的全局共享 我想知道是否有其他方法可以将此类代码插入到