如何在.net核心的剃刀页面中设置全局变量?

时间:2018-04-03 07:11:22

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

我想检查浏览器是否是IE并在剃刀页面中执行某些操作。

我刚刚在剃刀页面中创建了一个功能。

但是,我认为使用该函数检查浏览器是否在每个剃刀页面中都是多余的。对于独立用户,我只需要检查一次并设置一个全局变量IsIE = true / false.And其他页面很容易知道,如果它是IE。

问题是如何在剃刀页面中获取/设置全局变量?

谢谢。

----------------

致@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
    {

    } 
}

1 个答案:

答案 0 :(得分:3)

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

您要在此处尝试创建与每个客户端连接隔离的变量。通常,这是在SessionCookie变量的帮助下完成的。但在这种情况下,我不知道这将如何改善您编写的代码的性能。在您的代码中,您尝试从请求中访问Http标头。 Cookie和会话变量也以非常类似的方式访问。如果从标题直接获取的任何内容必须具有稍好的性能。如果您正在尝试清理代码,因此您不必在每个页面上都写这个,那么服务可能会非常有用。

您可以为此类服务创建一个类:

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>();

设置完成后,您可以在视图中使用:

@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位于您想要使用它的任何视图页面的顶部。虽然这仍然会为每个请求创建一个新对象,但它使用起来更干净,并且只创建一个对象,无论多少部分您正在使用的观点。