我接到了构建 ASP.NET Razor 网站的任务。这对我来说是新事物。我非常精通 PHP 和 ASP Classic。我需要弄清楚的是如何声明一个可以在任何地方访问的变量。我不知道在 .net 世界中你是否将其称为全局变量或应用程序变量或其他名称。但是,我将在经典 ASP 中执行此操作,如下所示。
在经典 ASP 中,我有一个名为 VarFunct.asp 的文件。这将是我声明变量并具有可以从任何地方访问的各种函数的文件。我将在我的所有页面上包含 VarFunct.asp 文件。无论如何,这就是我真正想做的事情(以经典 ASP 中的方式编写)...
SelLoc = Request("SelLoc")
If Len(Trim(SelLoc)) = 0 Then
SelLoc = "All"
End If
在这种情况下,Request("SelLoc") 可以是 Request.QueryString 或 Request.Form。然后我可以在网站的任何地方使用变量 SelLoc。所以,简而言之......我需要能够设置一个变量。检查Request.Form是否设置,如果没有设置,则检查Request.QueryString,如果没有设置为“All”。 我该怎么写这个?我该把它放在哪里?
当我使用 Visual Studio 2012 创建网站时,我选择了 ASP.NET 网站 (Razor V2)。
这似乎应该是任何具有任何类型的服务器端编程的网站的基本任务,但尝试在线查找信息和文档几乎是不可能的,但可能是因为我没有使用正确的术语来解决我的问题。我还没有找到任何关于设置可在整个网站上全局使用的变量的 Razor 教程。
您正在寻找的称为静态类/成员
这将允许您存储和共享整个应用程序的数据。
但是!由于 Web 服务器是多线程的,您不想这样做,否则您可能会遇到在完成当前请求之前数据被另一个请求覆盖的情况。
如果您需要将数据从控制器传递到视图,您可以使用
ViewBag
动态对象
如果您需要在其他地方使用数据(例如在辅助类中),则执行
HttpContext.Current.Application["VariableName"] = something
它基本上是一个字典,每个请求都会有一个不同的
Application
对象
有几种方法可以做到这一点。
对于您的示例,我假设这个特定变量对于同时使用该应用程序的不同用户来说可能是不同的。 这更多的是会话范围而不是应用程序范围。
在这种情况下,您可以简单地使用继承并创建一个所有其他控制器和/或视图模型继承的基本控制器和/或基本视图模型类。 这样您就可以在视图和控制器之间来回传递它,并在需要时读取/更新它。
如果满足您的需要,您还可以使用 asp.net 中内置的 Request 和 HttpContext 以及 Session 对象。 可以在这里找到其一些功能的简要概述:https://learn.microsoft.com/en-us/aspnet/web-pages/overview/api-reference/asp-net-web-pages-api-参考 --- 谷歌搜索特定的会产生大量结果。
如果您确实想要应用程序范围,您当然可以使用静态类来使用静态方法。 然后,您不需要将该类包含在所有其他类中,但在调用该方法时需要完全命名该方法。
不过,我不建议在这个级别使用静态变量。 我无法想象在应用程序实例运行时需要为每个用户更改很多事情。 我们使用的大多数此类项目都是缓存(通常是数据库查找等,我们不想每次都从数据库中检索,并且很少更新)。 如果您使用缓存,请在更新缓存时务必注意线程安全。 这是关于缓存的 msdn: https://msdn.microsoft.com/en-us/library/aa478965.aspx --- 或应用程序配置设置,例如应用程序环境。 我们从配置文件中提取大部分配置,它们是只读的,我们不会在应用程序的运行实例中更改它们。