C#的新手并尝试使用全局变量

时间:2010-03-11 16:15:26

标签: c# asp.net

是否可以在C#中使用全局变量?我来自主要是PHP背景,所以变量可以在任何地方访问,或只是global定义。

我的主要问题是我有一个User类,我自己编写了这个类来包装我公司数据库中的当前users表。我在MasterPage中定义它但似乎无法从实际页面访问它(我不知道是否有更好的词来描述它们,但它们是从MasterPage继承样式和格式的页面)

我的任何一般提示或实施方法?

编辑:这是我正在尝试做的一些代码片段:

Site.master.cs

public partial class SiteMaster : System.Web.UI.MasterPage
{
    public User user = new User();
}

logout.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="logout.aspx.cs" Inherits="logout" %>
<%@ MasterType  virtualPath="~/Site.master"%>

logout.aspx.cs

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        User user = Master.user;
    }
}

7 个答案:

答案 0 :(得分:4)

不,这是不可能的。可以创建单例或公共静态类,但这是不好的做法。

C#是为面向对象编程而设计的。如果您还没有使用面向对象范例编写程序,那么在开始之前可能有点难以切换到它。 OOP(http://en.wikipedia.org/wiki/Object-oriented_programming)建立在三个主要概念上:继承,多态和封装。

您可以定义分类的页面/主页,最好在App_Code文件夹中定义它们。

答案 1 :(得分:2)

拥有一个公共静态类并声明公共静态成员变量。

当我需要一些全局变量时,这就是我所做的,尽管我尽量避免使用它们。

答案 2 :(得分:2)

如果Page继承自MasterPage,则会在User中保护MasterPage属性,并且Page会显示该属性。

答案 3 :(得分:2)

通过在.aspx页面中设置MasterPageClass,可以访问使用它的页面的主页面类:

<%@ MasterType TypeName="MyTypeName" VirtualPath="~/MasterPageName.master" %>

听起来我可能只需要将您的代码放在稍微不同的地方。您可以通过独立类访问典型的User类,而不是捆绑到母版页或主类型中。

我可能会建议您将User类添加到项目的/ AppCode目录中的新类文件中(User.cs)。这样您就可以从页面访问它,而无需使用MasterType。

答案 4 :(得分:1)

请参阅我对 this 问题的回答。响应发送到浏览器后,非静态类级变量不会保留。这是因为每个Page对象都是该类的新实例,而不是上一次请求的实例。

使用“Session”属性,而不是我在链接中显示的内容。

答案 5 :(得分:1)

您的问题是从您的页面获取存储在母版页中的数据(假设我们在这里谈论ASP.Net MasterPage机制)?

如果是这样,你应该看看strongly-typed access to masterpages。基本上,您所做的是在MasterPage类中创建一个公共属性。然后,在您的Page中,声明MasterPageFile和MasterType,如下所示:

public partial class MasterPage
{
    public User CurrentUser{...}
}

在您的aspx页面中,声明使用母版页以及要使用的主类型。

<%@ Page  masterPageFile="~/MasterPage.master"%>
<%@ MasterType  virtualPath="~/MasterPage.master"%>

然后,您就可以在页面类中访问该属性,如下所示:

var user = Master.CurrentUser;

然后,有关初始化CurrentUser对象的位置的问题,请查看the list of page lifecycle events。如您所见,MasterPage.Init在之前触发 .Init和MasterPage.Load在 Page.Load之前触发。您可以使用MP.Init或MP.Load来确保数据在页面事件触发时已准备就绪,但首选Init。

答案 6 :(得分:0)

至少有几种不同的方法可以达到你想要的效果:

  1. 使用Application object - 它可用于存储全局内容,是ASP.Net的一部分。

  2. 使用static classes - 这是创建单身人士的另一种选择。