我的网络表单上有自定义控件:
<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中获取了Page对象,但似乎这个页面对象没有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 :(得分:1)
您无法从Page Method中访问页面实例的大多数属性和方法以及页面上的所有控件。为什么?因为页面方法调用不是回发,这意味着它不会经历页面生命周期,viewstate不可用,并且不会创建控件。请尝试使用UpdatePanel。
答案 1 :(得分: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");
}
答案 2 :(得分: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>
即使我这样做
[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 ...
知道为什么吗?
答案 3 :(得分:0)
静态成员无法引用实例引用。您需要从类中的其他实例方法传入对HttpContext或页面本身的引用。我要说你需要使用如下参数调用静态Web服务:
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;
}