我在field.ascx中有datalist,我在fields.ascx中有一个标签和文本框,我在datalist中动态绑定文本框和标签,并在webform.aspx中显示。现在我想在webform中获取标签文本和文本框值.aspx使用ajax单击webform.aspx中的按钮时。
field.ascx:
<asp:DataList ID="dtlist" runat="server" RepeatColumns="4" CellPadding="5" EnableViewState="True">
<ItemTemplate>
<data:Value ID="test" runat="server" />
<ItemTemplate>
</asp:DataList>
Fields.ascx:
<asp:Label ID="lbl" runat="server" />
<asp:TextBox id="tb4" runat="server" />
Webform.aspx
<button onclick="myFunction()">Click me</button>
[WebMethod]
public static string LoadUserControl()
{
using (Page page = new Page())
{
HtmlForm form = new HtmlForm();
UserControl userControl = (UserControl)page.LoadControl("UserControls/field.ascx");
form.Controls.Add(userControl);
using (StringWriter writer = new StringWriter())
{
page.Controls.Add(form);
HttpContext.Current.Server.Execute(page, writer, false);
return writer.ToString();
}
}
}
答案 0 :(得分:0)
您正在ASP.NET AJAX页面方法的以下行中销毁用户控件中的值:
using (Page page = new Page())
实际上,您无法在ASP.NET AJAX页面方法中访问Page
对象,因为它是static
并且根本不与ASP交互.NET页面生命周期。
如果您只有一个用户控件实例,那么您可以在myFunction
JavaScript函数中使用jQuery选择器来提取Label
和TextBox
的值控件(请注意ASP.NET用于母版页的容器命名和控件层次结构)。然后,您可以构建一个对象文字,以通过jQuery .ajax()
函数传递给ASP.NET AJAX页面方法。
如果您要在页面上拥有多个用户控件实例,那么最好使用服务器端解决方案,再加上ASP.NET UpdatePanel
控件,以提供异步的假象调用服务器(读取:屏幕闪烁较少,因为只有部分回发)。在这种情况下,您可以拥有要从用户控件中提取的值的public
属性,并且服务器端代码将通过ID引用每个用户控件实例。
所以底线是,如果您不需要实际使用客户端JavaScript函数来调用服务器,那么只需使用服务器端按钮单击处理程序来执行从服务器获取值的逻辑控制。当尝试从可能有多个实例的服务器端控件中获取值时,水很快变得混乱。