Доступ к элементам управления ascx из файла кода программной части ascx.cs

Это должно быть довольно просто. Я делаю сайт ASP.NET 2.0 без MVC. VS2008, кажется, генерирует элементы управления с областью <script> - я хочу, чтобы код был в коде, поэтому я подключил его вручную.

У меня есть следующее:

виджет.ascx:

<%@ Control Language="C#" ClassName="widget" Codebehind="widget.ascx.cs" Inherits="widget"%>

<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

виджет.ascx.cs:

namespace webapp
{
  public partial class widget : System.Web.UI.Control
  {
    protected void Page_Load(object sender)
    {
        Label1.Text = Session["user_id"].ToString();
    }
  }
}

Я копирую и вставляю этот материал со страниц ASPX, которые используют файлы кода программной части, но когда я пытаюсь скомпилировать, я получаю ошибки, которые Label1 does not exist in this context.

Любая помощь в этом вопросе приветствуется.


person jeffcook2150    schedule 08.09.2010    source источник


Ответы (3)


соответствует ли это объявлению других ваших страниц/элементов управления?

попробуйте использовать codebeside вместо codebehind / лучше посмотрите на объявления в других файлах проекта.

person eglasius    schedule 08.09.2010
comment
Да, это соответствует другим объявлениям. Я пробовал несколько других перестановок, и они тоже не сработали. :( Я тоже пробовал codebeside, но безуспешно. - person jeffcook2150; 09.09.2010

Ну, я, должно быть, создал элемент управления неправильно. Я начал с нового шаблона, и все заработало, как и ожидалось. Если вы столкнулись с этой проблемой, просто скопируйте свой код и попытайтесь снова попросить Visual Studio сгенерировать файлы из шаблонов пользовательских элементов управления. Убедитесь, что вы щелкнули правой кнопкой мыши имя проекта и добавили новый файл.

person jeffcook2150    schedule 17.09.2010

Чтобы понять, что здесь происходит, важно отметить, что файл разметки (.ascx) наследуется от файла кода программной части (.ascx.cs) и имеет доступ к его незакрытым полям. Не наоборот: вы не можете ссылаться на объекты, определенные только в файле разметки из кода программной части. В вашем примере это также можно было бы решить, поместив в файл widget.ascx.cs следующее:

protected Label Label1;

Но что! Когда Visual Studio повторно выполняет управление, вы, вероятно, не видите такой строки в файле .ascx.cs. Visual Studio управляет и поддерживает второй файл кода программной части, файл .ascx.designer.cs. partial в public partial class widget сигнализирует о том, что код элемента управления может быть определен в нескольких файлах. Вы управляете файлом .ascx.cs, а Visual Studio управляет файлом .ascx.designer.cs. Когда вы добавляете, удаляете и переименовываете элементы управления из файла разметки, Visual Studio должна добавлять, удалять и переименовывать связанные поля базового класса в файле кода программной части конструктора. Если вы удалили, отредактировали или исключили этот файл, возможно, Label1 был недоступен.

person maxwellb    schedule 18.12.2012