asp.net-mvc - 如何在 ASP.NET Core 的 Razor Pages 中设置全局变量?

标签 asp.net-mvc asp.net-core .net-core asp.net-core-mvc

我想检查浏览器是否是 IE 并在 Razor 页面中做一些事情。
我刚刚在 Razor 页面中做了一个功能来做到这一点。
但是,我认为在每个 Razor 页面中使用该功能检查浏览器是否为 IE 是多余的。对于独立用户,我只需要检查一次并设置一个全局变量 IsIE=true/false .如果是IE,其他页面很容易知道。
问题是如何在 Razor 页面中获取/设置全局变量?
谢谢你。
—————————————————
对于@Neville Nazerane,这是检查是否为 IE 的函数:

@{
    Boolean IsIE = false;
    string UA = Context.Request.Headers["User-Agent"].ToString();
    if (UA.Contains("Trident") || UA.Contains("MSIE"))
    {
        IsIE = true;
    }
    else
    {
        IsIE = false; ;
    }    
    if (IsIE == true)
    {
       
    }
    else
    {
       
    } 
}

最佳答案

HTTP 请求的工作原理是客户端向您的服务器发送请求(带有 header 和正文)。然后,您的服务器可以访问此信息并发送响应。这不会在服务器和客户端之间创建任何持久(正在进行的)连接。这意味着您的服务器和每个客户端之间没有永久链接。您声明的任何全局变量对于您的服务器的 Web 应用程序都是全局的,并且对于每个客户端都是通用的。

您在这里尝试做的是创建与每个客户端的连接隔离的变量。通常这是在 Session 的帮助下完成的或 Cookie多变的。但在这种情况下,我看不出这将如何提高您编写的代码的任何性能。在您的代码中,您试图从请求访问 Http header 。 Cookie 和 session 变量也以非常相似的方式访问。如果直接从标题中获取任何内容,则必须具有稍微好一点的性能。如果您正在尝试清理代码以便不必在每个页面上都写这些,服务可能会非常有用。

您可以为服务创建一个类,如下所示:

public class AgentChecker
{

    public bool IsIE { get; set; }

    // makes sure check is done only when object is created
    public AgentChecker(IHttpContextAccessor accessor)
    {
        string UA = accessor.HttpContext.Request.Headers["User-Agent"].ToString();
        if (UA.Contains("Trident") || UA.Contains("MSIE"))
        {
            IsIE = true;
        }
        else
        {
            IsIE = false; 
        }
    }

    // optional to simplify usage further. 
    public static implicit operator bool(AgentChecker checker) => checker.IsIE;

}

在您的启动类中添加以下内容:
// to access http context in a service
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// makes sure object is created once per request
services.AddScoped<AgentChecker>();

设置完成后,您可以在 View 中使用:
@inject AgentChecker checker

@* if you didn't create the implicit operator, you can use if (checker.IsIE) *@
@if (checker)
{
    <div>Is ie</div>
}
else
{
    <div>not ie</div>
}
inject位于您想要在其中使用它的任何 View 页面的顶部。虽然这仍然会在每个请求中创建一个新对象,但使用起来更干净,并且无论您使用多少个局部 View 都只创建一个对象。

关于asp.net-mvc - 如何在 ASP.NET Core 的 Razor Pages 中设置全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49624242/

相关文章:

razor - 如何将动态javascript注入(inject)asp .net core razor View

c# - 如何在 MVC 中实现自动完成文本框

asp.net-mvc - FineUploader 无法 POST

c# - OK 响应助手返回额外的 json 数据来响应

asp.net - DELETE 返回错误 405(方法不允许)我正在使用 React 和 ASP.Net Core

Azure AD B2C + 应用服务 + 功能 : How to flow the auth?

asp.net-mvc - Url.RouteUrl 返回 null

c# - LINQ to Entities 无法识别方法 'System.String get_Item (System.String)' ,

c# - 列映射到未命名列

c# - GetPathByAction 为 Dictionary<string,string> 创建错误的查询参数