繁体   English   中英

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

[英]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" >&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";
       }
   }

我建议使用简单的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM