2015-02-11 35 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"];