Проблема с поиском элементов управления страницы, которая использует мастер-страницу - PullRequest
1 голос
/ 13 апреля 2011

У меня есть набор страниц, каждая страница используется, чтобы запросить у пользователя данные и создать запись для этих данных в базе данных.

Я использую одинаковую технику для всех страниц. 2 панелипервый имеет все элементы управления вводом и отображается по умолчанию, а вторая панель показывает сообщение об успешном завершении и по умолчанию скрыта.

Теперь, когда пользователь нажимает кнопку «Отправить», если данныедействительно, я пишу пару строк, чтобы скрыть первую панель и показать первую. У меня есть около 20 страниц, использующих ту же технику, поэтому в качестве хорошей практики я добавил в свой веб-проект класс, который называется Helper, который ищет2 панели, затем скрыть и показать то, что мне нужно.

Я использовал один и тот же идентификатор панели для всех страниц, чтобы я мог легко его использовать!

Примечание: я сначала просто пошел дальше и искалпанель, но она не будет работать, поэтому я попытался найти элемент управления содержимым, который содержит панели и прочее (поскольку эта страница использует главную страницу), а затем найти панель.обе попытки не сработают!

public class Helpers
{
    public static void SuccessfulSubmission(Page p)
    {
        Content content = p.FindControl("Content2") as Content;
        Panel inputPanel = content.FindControl("inputPanel") as Panel;
        inputPanel.Visible = false;
    }
}

1 Ответ

1 голос
/ 13 апреля 2011

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

Однако, лучшим дизайном было бы создание класса базовой страницы вместе с конкретной главной страницей для управления этим взаимодействием. Например,

У вас будет главная страница (скажем, с именем TwoPanelMaster), которая будет использовать главную страницу вашего сайта и использовать макет с двумя панелями вместе с кнопкой отправки. Идея в том, что у вас есть стандартный макет, который контролируется с помощью главной страницы.

  <asp:Panel runat="server" ID="InputPanel">
     <asp:ContentPlaceholder runat="server" ID="Input"></asp:ContentPlaceholder>
  </asp:Panel>
  <asp:Panel runat="Server" ID="Message">
     <!-- put the UI for displaying message -->
  </asp:Panel>
  <asp:Button runat="server" ID="Submit" />

Предоставьте методы в главном коде, чтобы получить доступ к кнопке отправки, показать / скрыть панели и т. Д.

Теперь создайте класс базовой страницы, который будет кодировать основное взаимодействие -

public abstract class InputPage : System.Web.UI.Page
{
  protected override OnLoad(EventArgs e)
  {
     var master = this.Master as TwoPanelMaster;
     master.GetSubmitButton().OnClick += Submit_Click();
  }

  private void Submit_Click(object sender, EventArgs e)
  {
     ValidateInput();
  }

  protected virtual void ValidateInput()
  {
     // do some common code (if any)
     string message;
     if (OnValidateInput(out message))
     {
        // validation succesful, show success message
        var master = this.Master as TwoPanelMaster;
        master.ShowMessage(message); // this method should hide the input panel and display message panel.
     }
  }

  // pages should provide implementation of this method
  protected abstract bool OnValidateInput(out string successMessage);

}

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

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