Несколько экземпляров usercontrol на одной странице, но ссылаются только на последний элемент управления

#c# #jquery #asp.net

#c# #jquery #asp.net

Вопрос:

У меня есть UserControl , который позволяет пользователю загружать файлы, а также отображает их в GridView . На родительской странице у меня есть элемент управления jQuery tab, к которому я динамически добавляю 2 экземпляра my UserControl (на разных вкладках). Второй экземпляр работает нормально, поэтому я знаю, что элемент управления работает. Однако, когда я пытаюсь загрузить файл, используя первый экземпляр, второй экземпляр удаляется referenced…so все значения свойств, имена элементов управления и т.д. Указывают на значение второго.

Вот как я загружаю элементы управления в коде родительской страницы:

 protected void Page_Load(object sender, EventArgs e)
{
  MyControl ucAttachments1 = (MyControl) Page.LoadControl("~/controls/mycontrol.ascx");
  ucAttachments1.ID = "ucAttachments1";
  ucAttachments1.Directory = "/uploads/documents";
  ucAttachments1.DataChanged  = new MyControl.DataChangedEventHandler(DoSomething);
  phAttachments1.Controls.Add(ucAttachments1);

  MyControl ucAttachments2 = (MyControl)Page.LoadControl("~/controls/mycontrol.ascx");
  ucAttachments2.ID = "ucAttachments2";
  ucAttachments2.Directory = "/uploads/drawings";
  ucAttachments2.DataChanged  = new MyControl.DataChangedEventHandler(DoSomething);
  phAttachmetns2.Controls.Add(ucAttachments2);
}
  

в html:

 <div id="tabContainer">
    <div id="files">
        <asp:PlaceHolder id="phAttachments1" runat="server" />
    </div>
    <div id="drawings">
        <asp:PlaceHolder id="phAttachments2" runat="server" />
    </div>
</div>
  

фрагмент кода пользовательского элемента управления:

 private string directory;

override protected void OnLoad(EventArgs e)
{
    PopulateAttachmentGridview();
}

protected btnUpload_Click(object sender, EventArgs e)
{
    UploadFile(directory);
}

public string Directory
{
    get { return directory; }
    set { directory = value; }
}
  

Как я могу убедиться, что на мои usercontrols правильно ссылаются?

Комментарии:

1. Я думаю, нам нужно увидеть больше кода

2. Какой код в методе doSomething

Ответ №1:

Проверьте фактический html и javascript, отображаемый клиенту, чтобы убедиться, что нет дублирующегося идентификатора, связанного с элементами управления, проскальзывающими через трещины.

Комментарии:

1. Ранее я проверил все идентификаторы элементов управления, чтобы убедиться в отсутствии дубликатов, но не javascript. Проблема заключалась в том, что у меня был дублированный код javascript, и правильное диалоговое окно не появлялось и, следовательно, вызывала неправильную кнопку. Спасибо!

Ответ №2:

Я думаю, что это проблема

 MyControl ucAttachments1 = (MyControl) Page.LoadControl("~/controls/mycontrol.ascx");

MyControl ucAttachments2 = (MyControl)Page.LoadControl("~/controls/mycontrol.ascx");
  

вы ссылаетесь на один и тот же экземпляр элемента управления на две разные переменные. Итак, теперь у вас есть две разные ссылки на один и тот же экземпляр, теперь, когда вы, наконец, установили свойства для «ucAttachments2», происходит то, что ваши свойства второго элемента управления устанавливаются для экземпляра.. таким образом, всякий раз, когда вы пытаетесь получить доступ к этому экземпляру (используя «ucAttachments1» или «ucAttachments2»), вы получаете свойства второго элемента управления.

ПОПРОБУЙТЕ ВЫПОЛНИТЬ :

 MyControl ucAttachments1 = new MyControl();
ucAttachments1 = (MyControl) Page.LoadControl("~/controls/mycontrol.ascx");
 ucAttachments1.ID = "ucAttachments1";
  ucAttachments1.Directory = "/uploads/documents";
  ucAttachments1.DataChanged  = new MyControl.DataChangedEventHandler(DoSomething);
  phAttachments1.Controls.Add(ucAttachments1);


MyControl ucAttachments2 = new MyControl();
ucAttachments2 = (MyControl) Page.LoadControl("~/controls/mycontrol.ascx");
ucAttachments2.ID = "ucAttachments2";
  ucAttachments2.Directory = "/uploads/drawings";
  ucAttachments2.DataChanged  = new MyControl.DataChangedEventHandler(DoSomething);
  phAttachmetns2.Controls.Add(ucAttachments2);