2015-02-11 86 views
0

我有一個簡單的asp.net webform頁面,我用它來顯示基於pageID的頁面相關數據。在asp.net頁面上編譯錯誤

我想定義頁面級別的變量,以便我可以訪問該頁面中使用的不同功能的變量。但我越來越少的錯誤。例如,如果我的代碼是這樣

public partial class PageHome : System.Web.UI.Page 
    { 
      int _LangID = 1; 
      _LangID = int.Parse(Helper.GetAppSetting("LangID_En")); 
      int _PageID = 0; 
      int _PID = Helper.GetPageID(_LangID, "Home.aspx"); 


    protected void Page_Load(object sender, EventArgs e) 
    { 
     int _LanguageID = _LangID; 
     GetPageDetails(_PageID); 
    } 

} 

然後我得到

Error message: 
Invalid token '=' in class, struct, or interface member declaration (_LangID = int.Parse(Helper.GetAppSetting("LangID_En"));) 
Invalid token '.' in class, struct, or interface member declaration (_LangID = int.Parse(Helper.GetAppSetting("LangID_En"));) 
Method must have a return type 
Identifier expected 

,如果我嘗試使用定義這些變量中構造

//public PageHome() 
//{ 
    //int _LangID = 1; 
    //_LangID = int.Parse(Helper.GetAppSetting("LangID_En")); 
    //int _PageID = 0; 
    //int _PID = Helper.GetPageID(_LangID, "Home.aspx"); 
//} 

然後我得到不同的錯誤,如

The name '_LangID' does not exist in the current context The name '_PageID ' does not exist in the current context

什麼是定義在不同的功能定義一次,訪問頁面級變量的最佳方式

更新Helper.GetAppSetting("LangID_En")Helper.GetPageID(_LangID, "Home.aspx")功能都在一個單獨的類文件中定義下保持App_Code/Helper/Helper.cs

更新二:根據JonSKeet回答的工作代碼。

public partial class PageHome : System.Web.UI.Page 
    { 
      int _LangID = 1; 
      _LangID = int.Parse(Helper.GetAppSetting("LangID_En")); 
      int _PageID = 0; 
    public PageHome() 
    { 
      int _PID = Helper.GetPageID(_LangID, "Home.aspx"); 
} 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     int _LanguageID = _LangID; 
     GetPageDetails(_PageID); 
    } 

} 
+0

我不清楚 - 你是否期望你的'Page_Load'方法成爲你的'PageHome'類的一部分?因爲目前還沒有... – 2015-02-11 08:17:11

+0

@JonSkeet,剛剛更新了我的代碼,因爲在本例中錯誤地定義了varibale之後關閉了類。 – Learning 2015-02-11 08:18:19

回答

5

你不能只是有這樣一種說法:

_LangID = int.Parse(Helper.GetAppSetting("LangID_En")); 
類聲明中

。它必須在方法,構造函數或類似的東西中。

然而,鑑於你剛剛聲明的變量,你可以簡單地改變這些兩行:

int _LangID = 1; 
_LangID = int.Parse(Helper.GetAppSetting("LangID_En")); 

...一:

int _LangID = int.Parse(Helper.GetAppSetting("LangID_En")); 

但是,你會再這裏有一個錯誤:

int _PID = Helper.GetPageID(_LangID, "Home.aspx"); 

因爲你不能在初始化器中引用另一個實例字段。在初始化必須在構造函數中發生......在這種情況下,我建議做它們的構造都,爲了清楚:

public class PageHome : Page 
{ 
    // Do you really not need to initialize this to something else? 
    int _PageID = 0; 
    int _LangID; 
    int _PID; 

    public PageHome() 
    { 
     _LangID = int.Parse(Helper.GetAppSetting("LangID_En")); 
     _PID = Helper.GetPageID(_LangID, "Home.aspx"); 
    } 

    ... 
} 

在另一方面,做那些價值實際上在每個頁面實例的基礎上更改?也許他們實際上應該是靜態的領域? (很難說這是什麼大的圖片。)

+0

即使我這樣做就像你已經提到,然後我得到錯誤'int _PID = Helper.GetPageID(_LangID,「Home.aspx」);'這行作爲'字段初始值設定項不能引用非靜態字段,方法,或屬性'PageHome._LangID'' – Learning 2015-02-11 08:25:02

+2

@KnowledgeSeeker:是的,你需要把*那*一個放入構造函數中。將這個添加到答案中。 – 2015-02-11 08:27:17

0

只是爲了確保我會sugest從appsettings中tryparsing int 您可以在某種形式的tryparse方法中獲得appsettings。這種方式不會是一個錯誤,如果設置丟失,並且int將有一個空值。

protected void Page_Load(object sender, EventArgs e) 
    { 
int? _LangID = TryParse2(Helper.GetAppSetting("LangID_En")); 
} 
int? TryParse2(string s) { 
    int i; 
    if (!int.TryParse(s, out i)) { 
     return null; 
    } else { 
     return i; 
    } 
} 

此外,你的類助手是否應用程序設置的核心方式?我個人喜歡使用類似

var debugSetting = ConfigurationManager.AppSettings["IsDebug"];