Mel*_* NG 5 asp.net-mvc asp.net-core-mvc .net-core asp.net-core
我想检查浏览器是否是 IE 并在剃刀页面中做一些事情。
我刚刚在剃刀页面中做了一个功能来做到这一点。
但是,我认为在每个razor页面中使用该功能检查浏览器是否为IE是多余的。对于独立用户,我只需要检查一次并设置一个IsIE = true / false的全局变量。其他页面将很容易知道,如果是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
{
}
}
Run Code Online (Sandbox Code Playgroud)
HTTP 请求的工作原理是客户端向您的服务器发送请求(带有标头和正文)。然后,您的服务器可以访问此信息并发送响应。这不会在服务器和客户端之间创建任何持久(正在进行的)连接。这意味着您的服务器和每个客户端之间没有永久链接。您声明的任何全局变量对于您的服务器的 Web 应用程序都是全局的,并且对于每个客户端都是通用的。
您在这里尝试做的是创建与每个客户端的连接隔离的变量。通常这是在Session或Cookie变量的帮助下完成的。但在这种情况下,我看不出这将如何提高您编写的代码的任何性能。在您的代码中,您试图从请求访问 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;
}
Run Code Online (Sandbox Code Playgroud)
在您的启动类中添加以下内容:
// to access http context in a service
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// makes sure object is created once per request
services.AddScoped<AgentChecker>();
Run Code Online (Sandbox Code Playgroud)
设置完成后,您可以在视图中使用:
@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>
}
Run Code Online (Sandbox Code Playgroud)
在inject进入你想用这个任意视图页面的顶部。尽管这仍然会创建一个新的对象的每个请求,它是清洁剂使用,只创建一个对象,无论你有多少局部视图中使用。
| 归档时间: |
|
| 查看次数: |
10795 次 |
| 最近记录: |