2010-01-27 5 views
0

У меня есть пользовательский элемент управления на моем веб-форму:Невозможно получить на таможенный контроль

<form id="form" runat="server"> 
     <clc:CustomList 
     ID="myList" 
     runat="server" 
     AddButtonText="add" 
     DeleteButtonText="del" 
     MoveUpButtonText="up" 
     MoveDownButtonText="down"/> 
     <div id="test" runat="server"></div> 
</form> 

Мне нужно, чтобы добраться до этого контроля со статическим WebMethod. Я получаю объект страницы из текущего HttpContext, но кажется, что этот объект страницы не имеет contorls (количество элементов управления равно 0).

[WebMethod] 
public static List<CustomListControl.IListItem> GetListItems() 
{ 
    Page page = HttpContext.Current.Handler as Page; 

    Control control = null; 

    if (page != null) 
    { 
     control = FindControlRecursive(page, "myList"); 
    } 
    return null; 
} 

private static Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id) 
    { 
     return root; 
    } 

    foreach (Control c in root.Controls) 
    { 
     Control t = FindControlRecursive(c, id); 
     if (t != null) 
     { 
      return t; 
     } 
    } 

    return null; 
} 

Любая идея, почему и как добраться до моего контроля? Спасибо!

ответ

0

Попробуйте стандартное управление внутри страницы.
Если вы можете найти его по ID, то вы, вероятно, сделали что-то неправильное, зарегистрировав свой собственный элемент управления (возможно, вы могли бы предоставить весь код aspx?).
Также обратите внимание, что класс Page имеет встроенный метод FindControl.

Например, это должно работать:

<form id="form1" runat="server"> 
<div> 
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
</div> 
</form> 

и в .cs файл:

protected void Page_Load(object sender, EventArgs e) { 
    var tb = FindControl("TextBox1"); 
} 
+0

Я могу получить контроль над событием Page_Load. Я не могу достичь этого из статического WebMethod (похоже, что объект страницы, который я получаю из текущего HttpContext, не является реальным объектом страницы:>) ... – Heko

0

я пост, как это так, я могу добавить код ...

ASPX:

<%@ Register Assembly="CustomListControl" Namespace="CustomListControl" TagPrefix="clc" %> 
<%@ Import Namespace="System.Web.Services" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head id="head" runat="server"> 
    <title>MyList</title> 
</head> 
<body> 
    <form id="form" runat="server"> 
     <clc:CustomList 
      ID="myList" 
      runat="server" 
      AddButtonText="add" 
      DeleteButtonText="del" 
      MoveUpButtonText="up" 
      MoveDownButtonText="down"/> 
      <div id="test" runat="server"></div> 
    </form> 
</body> 
</html> 

Даже если я do

[WebMethod] 
public static List<CustomListControl.IListItem> GetListItems() 
{ 
    Page page = HttpContext.Current.Handler as Page; 

    if (page != null) 
    { 
     var c = page.FindControl("myList"); 
    } 
    return null; 
} 

Я получаю c = null; Я не могу найти элемент управления формы из этого объекта страницы ...

Если я делаю var c = this.FindControl («myList») - это событие загрузки страницы, я попадаю в элемент управления. Проблема в том, что я не могу перейти к статическому WebMethod ...

Любая идея, почему?

1

Вы не можете получить доступ ко всем свойствам и методам экземпляра страницы и всем элементам управления на странице из метода страницы. Зачем? Поскольку вызов метода страницы не является обратной передачей, что означает, что он не проходит жизненный цикл страницы, viewstate недоступен, а элементы управления не создаются. Вместо этого попробуйте использовать UpdatePanel.

+0

У меня есть настраиваемый элемент управления (список элементов с встроенным редактированием, перетаскивание jQuery, добавление и удаление функциональных возможностей). Когда клиент вносит изменения, новое состояние должно быть (ajax) отправлено на сервер (управление). Как захватить эти события из UpdatePanel? Лучше ли сделать UpdatePanel внутри настраиваемого элемента управления? Мне нужно что-то вроде этого: пользовательский контроль с действиями, которые делают пост ajax от клиента к серверу, когда некоторые события происходят в элементе управления. Любые идеи, как это сделать? – Heko

+0

По умолчанию все элементы управления обратной связью внутри панели обновления вызывают частичную обратную передачу.Вы также можете создавать элементы управления вне UpdatePanel в качестве триггеров или использовать __doPostBack для ручного запуска частичной обратной передачи с помощью javascript. Ваш элемент управления должен опубликовать событие, на котором вы можете подписаться на странице, затем вы можете поместить свою логику кода в обработчик событий. –

0

Статические элементы не могут ссылаться на ссылки экземпляров. Вам нужно будет передать ссылку на HttpContext или сама страница из какого-либо другого метода экземпляра в классе. Я бы сказал, что вам нужно вызвать статический веб-сервис с таким параметром:

protected void Page_Load(object sender, EventArgs e) { 
    var tb = GetListItems(this); 
} 

[WebMethod] 
public static List<CustomListControl.IListItem> GetListItems(System.Web.UI.Page page) 
{ 
    var c = null;  

    if (page != null) 
    { 
     c = page.FindControl("myList"); 
    } 
    return c; 
}