2010-03-11 17 views
3

是否可以在C#中使用全局變量?我主要來自PHP背景,所以變量可以在任何地方訪問,或者只需定義一個globalC#的新手和嘗試使用全局變量

我的主要問題是我有一個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; 
    } 
} 
+1

下面可能會根據不同的建議(和警告)。如果你確實選擇使用全局變量,我建議你這樣做只是爲了推進,但儘快重構它們。 – 2010-03-11 16:21:01

+0

不要認爲你的問題是全局變量或不是。而不是如何從你的頁面實例到你的母版頁中的數據。 – 2010-03-11 16:32:22

+0

@Peter - 是的你是對的 – 2010-03-11 17:08:21

回答

2

有一個公共靜態類和聲明公共靜態成員變量。

這就是我當我需要一些全局變量時所做的,雖然我儘量避免使用它們。

4

不,這是不可能的。可以創建單例或公共靜態類,但這是不好的做法。

C#是面向對象編程設計的。如果你沒有用面向對象的範例編寫程序,那麼在開始之前可能有點難以切換到它。 OOP(http://en.wikipedia.org/wiki/Object-oriented_programming)建立在三個主要概念上:繼承,多態和封裝。

您可以定義分類的頁面/主頁面,最好在App_Code文件夾中定義它們。

+1

只需添加到@Andrew Bezzub的答案 - 公共靜態類通常用於聲明全局常量,而不是保持全局狀態。如果您需要全局狀態,請使用單例。 – 2010-03-11 16:21:43

0

至少有一對夫婦不同的方式來實現你想要的:

  1. 使用Application object - 它可以用來存儲全局的東西,是ASP.Net的一部分。

  2. 使用static classes - 這是創建單身人士的另一種選擇。

2

如果PageMasterPage繼承,然後進行User財產MasterPage保護,這將是可見的Page

1

看到我的回答this問題。一旦將響應發送到瀏覽器,非靜態的類級變量不會保留。這是因爲每個頁面對象將成爲該類的新實例,與上次請求不一樣。

使用「會話」屬性,而不是我顯示在鏈接中。

2

母版頁類可以是通過像這樣設置MasterPageClass在.aspx頁面中使用它的頁面訪問:

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

這聽起來像你對我可能只是需要把你的代碼一個稍微不同的地方。一個典型的User類可以通過獨立的類訪問您的項目,而不是綁定到主頁面或主類型。

我可能會建議您將User類添加到項目的/ AppCode目錄中的新類文件中,而不是(User.cs)。這將讓你可以從你的頁面訪問它,而無需使用MasterType。

+0

是的我在/ App_Code中有User.cs(vs建議我放在那裏,所以我想爲什麼不這樣做) - 但我需要在某處(我認爲在MasterPage中)將其定義爲'User current_user = new User() ;'然後嘗試從所有實際頁面獲取'current_user' – 2010-03-11 17:12:25

1

您的問題是從您的頁面獲取到存儲在主頁面中的數據(假設我們正在討論ASP.Net MasterPage機制)?

如果是這樣,你應該看看strongly-typed access to masterpages。基本上,你要做的是在你的MasterPage類中創建一個公共屬性。然後,在你的頁面,聲明的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在之前觸發Page.Init和MasterPage.Load在 Page.Load之前觸發。您可以使用MP.Init或MP.Load來確保頁面事件觸發時數據已準備好,但首選Init。

+0

Peter我添加了一堆代碼片段來解決我的問題,有什麼想法?我認爲你最接近了解我正在嘗試做什麼 – 2010-03-11 17:19:31

+0

你正走在正確的軌道上。但是'CodeFile =「logout.aspx.cs」Inherits =「logout」'對於名爲'_Default'的頁面看起來不正確。剪切 - 粘貼錯誤? – 2010-03-11 17:25:39