2015-02-11 3 views
0

У меня есть простая страница веб-формы asp.net, которую я использую для отображения связанных с страницей данных на основе 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

Каков наилучший способ определить страницы переменного уровня, которые определяются один раз и доступ в другой функции

Update: Helper.GetAppSetting("LangID_En") и Helper.GetPageID(_LangID, "Home.aspx") функции определены в отдельном файле класса под держать под App_Code/Helper/Helper.cs

Обновление 2: Рабочий код на основе 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'? Потому что это не на данный момент ... –

+0

@JonSkeet, только что обновил мой код, поскольку у меня был закрытый класс после определения varibale по ошибке в этом примере. – Learning

ответ

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 »);' this line как 'Инициализатор поля не может ссылаться на нестатические поля, или свойство «PageHome._LangID'' – Learning

+2

@KnowledgeSeeker: Правильно, вам нужно поместить * тот * один в конструктор. Добавьте это к ответу. –

0

Просто, чтобы убедиться, что я буду стараться пробовать int из appsettings Вы можете сделать какой-то метод tryparse в ведьме, вы можете получить настройки. Таким образом, не будет ошибки, если параметры отсутствуют, а значение 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; 
    } 
} 

Также ваш помощник класса получает настройки приложения по-другому? Я лично использую somthing, как

var debugSetting = ConfigurationManager.AppSettings["IsDebug"]; 
Смежные вопросы