根据另一个控件的结果更新用户控件

时间:2012-02-21 17:11:59

标签: c# asp.net controls

我是ASP.NET C#的新手并试图完成以下任务:

有一个带有两个用户控件的Default.aspx页面(Control1.ascx和Control2.ascx) 两个用户控件都在UpdatePanels中。

需要禁用第二个用户控件上的TextBox,直到第一个控件上的TextBox已经过验证。验证后,需要启用用户控件2上的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" >&nbsp;</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" >&nbsp;</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";
       }
   }

3 个答案:

答案 0 :(得分:0)

我建议使用简单的javascript或使用jQuery来执行启用/禁用操作,将一些js代码添加到客户端验证脚本中

答案 1 :(得分:0)

我建议先让您的方案使用同步回发,然后将更新面板添加到组合中。作为草图,在某个按钮或其他按钮的服务器端OnClick处理程序中,您可以根据第一个控件的验证结果设置第二个控件的启用性。然后,当发生asynch回发目标Control1.ascx的UpdatePanel时,您需要确保在Control2.ascx的UpdatePanel上调用Update()

也就是说,从用户的角度来看,这会有点令人讨厌。除非第一个控件调制其下方的大量UI(例如,完全切换到单独的控件集),为什么不让用户在两个字段中输入文本并验证它们的组合?

答案 2 :(得分:0)

我同意西蒙的观点。 jQuery可能是实现这一目标的最简单方法。你可以使用jQuery的ajax方法调用WebMethods,如果你因任何原因需要与后面的代码进行交互。

我已经使用了更新面板和ICallbackEventHandler接口(http://madskristensen.net/post/Asynchronous-GridView-in-5-simple-steps.aspx是其使用的一个很好的例子)并取得了一些成功。

虽然我倾向于远离UpdatePanels,但我意识到他们在幕后使用ICallbackEventHandler接口,我可能会为自己做更多工作。这样做的唯一好处就是我在ViewState中没有一堆垃圾(UpdatePanels喜欢ViewState),因为我已经将它保存在服务器端会话状态。

在我的例子中,使用ICallbackEventHandler方法而不是在后面的代码中使用jQuery的ajax调用和WebMethods的原因是我想要访问非静态字段(包括我的Web控件)。事实证明我需要在会话中以其他方式手动持久保存页面上显示的数据,并最终可能最终为自己做更多的工作。这是一个学习新东西的好机会,但是我从访问页面控件中获得的好处很少/不存在。