Обновление пользовательских элементов управления на основе результата другого элемента управления - PullRequest
0 голосов
/ 21 февраля 2012

Я новичок в ASP.NET C # и пытаюсь выполнить следующее:

Иметь страницу Default.aspx с двумя пользовательскими элементами управления (Control1.ascx и Control2.ascx) Оба пользовательских элемента управления находятся в UpdatePanels.

Необходимо отключить TextBox на втором пользовательском элементе управления до тех пор, пока TextBox на первом элементе не будет проверен.После проверки необходимо включить TextBox на пользовательском контроле 2.

Эти пользовательские элементы управления будут повторно использоваться на нескольких страницах.Помощь приветствуется.Если мне нужно опубликовать некоторый код, дайте мне знать.

Вот пример кода:

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"/>

По умолчанию.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 голосов
/ 21 февраля 2012

Я предлагаю сначала поработать с вашим сценарием с синхронными обратными передачами, а затем добавить в него панели обновления. В качестве грубого эскиза, в обработчике OnClick на стороне сервера для той или иной кнопки вы можете установить включение второго элемента управления на основе результата проверки первого элемента управления. Затем вам просто нужно убедиться, что вы вызываете Update() на UpdatePanel Control2.ascx, когда происходит асинхронная обратная передача с таргетингом на UpdatePanel Control1.ascx.

Тем не менее, это будет слегка раздражать с точки зрения пользователя. Если первый элемент управления не модулирует значительный пользовательский интерфейс под ним (например, полностью переключается на отдельный набор элементов управления), почему бы просто не позволить пользователям вводить текст в оба поля и проверять их комбинацию?

0 голосов
/ 21 февраля 2012

Я согласен с Саймоном. JQuery, вероятно, будет самым простым способом сделать это. Вы можете использовать jjuery-методы ajax, чтобы делать вызовы к WebMethods, если по какой-либо причине вам нужно взаимодействовать с этим кодом.

Я использовал панели обновления и интерфейс ICallbackEventHandler (http://madskristensen.net/post/Asynchronous-GridView-in-5-simple-steps.aspx - хороший пример его использования) с некоторым успехом.

Хотя я стараюсь держаться подальше от UpdatePanels, я понял, что они используют интерфейс ICallbackEventHandler за кулисами, и я, вероятно, больше работаю для себя. Единственное преимущество в том, что я сделал это так, что у меня в ViewState нет кучки мусора (UpdatePanels любит ViewState), поскольку я сохранил его в состоянии сеанса на стороне сервера.

В моем случае, причина перехода с помощью метода ICallbackEventHandler на использование ajax-вызовов jQuery и WebMethods в коде была в том, что я хотел иметь доступ к нестатическим полям (включая мои веб-элементы управления). Оказывается, мне нужно было вручную сохранить данные, отображаемые на странице в сеансе или каким-либо другим образом, и, вероятно, в конечном итоге мне пришлось больше работать для себя. Это был хороший шанс узнать что-то новое, но преимущества, которые я получил от доступа к элементам управления страниц, были минимальными / отсутствовали.

0 голосов
/ 21 февраля 2012

Я предлагаю пойти с простым javascript или задействовать jQuery для включения / выключения, добавить некоторый js-код в скрипт проверки на стороне клиента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...