![](/img/trans.png)
[英]recreation of dynamic controls in user control based in selection in another user control
[英]Updating User Controls based on result of another control
我是ASP.NET C#的新手,正在尝试完成以下任务:
具有两个用户控件(Control1.ascx和Control2.ascx)的Default.aspx页。两个用户控件都在UpdatePanels中。
需要禁用第二个用户控件上的TextBox,直到验证第一个控件上的TextBox。 验证后,需要在用户control2上启用TextBox。
这些用户控件将在多个页面上重复使用。 感谢帮助。 如果我需要发布一些代码,请告诉我。
这是代码示例:
Default.aspx
<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register src="Control1.ascx" tagname="CTL1" tagprefix="uc1" %>
<%@ Register src="Control2.ascx" tagname="CTL2" tagprefix="uc2" %>
<uc1:CTL1 Id="CTL1" runat="Server" UpdateMode="Conditional"/>
<uc2:CTL2 Id="CTL2" runat="Server" UpdateMode="Conditional"/>
Default.aspx.cs
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
Control1.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Control1.ascx.cs" Inherits="Control1" %>
<asp:UpdatePanel ID="UpdatePanel_Fld1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:TextBox ID="TextBox_Fld1" runat="server" Enabled="True" ></asp:TextBox>
<asp:ImageButton ID="ImageButton_ValidateFld1" runat="server" ImageUrl="~/images/validate.jpg"
onclick="ImageButton_ValidateFld1_Click" />
<asp:Label ID="LabelFld1Summary" runat="server" > </asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
Control1.ascx.cs
public partial class Control1 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
public void ImageButton_ValidateFld1_Click(object sender, ImageClickEventArgs e)
{
LabelFld1Summary.Text = "Validated";
}
}
Control2.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Control2.ascx.cs" Inherits="Control2" %>
<asp:UpdatePanel ID="UpdatePanel_Fld2" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:TextBox ID="TextBox_Fld2" runat="server" Enabled="False"></asp:TextBox>
<asp:ImageButton ID="ImageButton_ValidateFld2" runat="server" ImageUrl="~/images/validate.jpg"
onclick="ImageButton_ValidateFld2_Click" />
<asp:Label ID="LabelFld2Summary" runat="server" > </asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
Control2.ascx.cs
public partial class Control2 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
public void ImageButton_ValidateFld2_Click(object sender, ImageClickEventArgs e)
{
LabelFld2Summary.Text = "Validated";
}
}
我建议使用简单的JavaScript或让jQuery进行启用/禁用操作,将一些js代码添加到客户端验证脚本中
我建议您先使您的方案与同步回发一起使用,然后再将updatepanels添加到组合中。 作为粗略的草图,在服务器端的某个按钮或其他按钮的OnClick
处理程序中,您可以根据第一个控件的验证结果来设置第二个控件的启用性。 然后,只需确保在针对Control1.ascx的UpdatePanel的异步回发发生时,在Control2.ascx的UpdatePanel上调用Update()
。
就是说,从用户的角度来看这将是令人讨厌的。 除非第一个控件在其下方调制了大量UI(例如,完全切换到单独的控件集),否则为什么不让您的用户在两个字段中输入文本并验证它们的组合?
我同意西蒙的观点。 jQuery可能是实现此目的的最简单方法。 如果出于任何原因需要与背后的代码进行交互,则可以使用jQuery的ajax方法来调用WebMethod。
我使用了更新面板和ICallbackEventHandler接口( http://madskristensen.net/post/Asynchronous-GridView-in-5-simple-steps.aspx是其使用的一个很好的例子),并取得了一些成功。
尽管我倾向于远离UpdatePanels,但我意识到它们在后台使用了ICallbackEventHandler接口,我可能会为自己做更多的工作。 按照我的方式进行操作的唯一好处是,在ViewState中没有一堆垃圾(UpdatePanels喜欢ViewState),因为我将其持久保存在服务器端会话状态中。
就我而言,使用ICallbackEventHandler方法而不是在后面的代码中使用jQuery的ajax调用和WebMethods的原因是我想访问非静态字段(包括我的Web控件)。 事实证明,我需要在会话中手动保存页面上显示的数据,否则最终可能需要为我自己做更多的工作。 这是学习新知识的好机会,但是我从访问页面控件中获得的好处很小/根本不存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.