Как обработать событие кнопки главной страницы на странице содержимого?

#c# #asp.net #webforms #master-pages

#c# #asp.net #веб-формы #мастер-страницы

Вопрос:

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

  1. Я слышал о двух подходах к поиску кнопки и добавлению обработчика или использованию интерфейса (ознакомьтесь с обоими подходами здесь) .. Какой из них вы предлагаете?

  2. Не могли бы вы, пожалуйста, проиллюстрировать параметр «Интерфейс» каким-нибудь кодом и указать, к какому классу отнести файл интерфейса, потому что он не читается на странице, когда я пытаюсь его наследовать!

Ответ №1:

Второй подход, по-моему, лучше. Первый вариант привязывает страницу к конкретной главной странице, и это не очень приятно.

Все файлы размещаются в одной папке.

IPageInterface.cs:

 namespace CallFromMasterPage
{
    public interface IPageInterface
    {
        void DoSomeAction();
    }
}
  

Default.aspx.cs:

 namespace CallFromMasterPage
{
    public partial class Default : System.Web.UI.Page, IPageInterface
    {
        public void DoSomeAction()
        {
            throw new NotImplementedException();
        }
    }
}
  

Сайт.Master.cs:

 namespace CallFromMasterPage
{
    public partial class SiteMaster : System.Web.UI.MasterPage
    {
        protected void Button1_Click(object sender, EventArgs e)
        {
            IPageInterface pageInterface = Page as IPageInterface;
            if (pageInterface != null)
            {
                pageInterface.DoSomeAction();
            }
        }
    }
}
  

Существуют другие подходы. Например. вы можете опубликовать событие через event broker.

Комментарии:

1. Хорошо, это здорово, но у меня проблема.. куда правильно поместить файл интерфейса.. Я использую N-уровневую архитектуру PL, BLL, DAL? Я действительно застрял в этой детали, поскольку код моей страницы за файлом не увидит мой интерфейс, даже если я поместил его в ту же папку или даже попытался добавить папку App_Data!

2. Вы используете веб-сайт или проект веб-приложения?

3. Следующий вопрос, я надеюсь, вы не возражаете.. Ваш код работает как шарм, но я не понимаю эту часть «IPageInterface pageInterface = Страница как IPageInterface;». Не могли бы вы немного разбить это, пожалуйста?

4. У меня получается, что NULL следовательно, выполняется обратная отправка :/

Ответ №2:

Смотрите из моего Openion, будет лучше, если вы будете использовать обработчики событий … и даже с пользовательским делегатом..

вот так

 public delegate ReturnType MasterPageButtonHandler(CustomEventArgs ObjPriargs);
public event MasterPageButtonHandler MasterPagebuttonClick;
.
.
.
.
Button.click =new EventHandler(Button1_Click);
.
.
.
protected void Button1_Click(Object sender,EventArgs e)
{
     if(MasterPagebuttonClick!=null)
     {
         CustomEventArgs ObjPriargs=new CustomEventArgs();
         ObjPriargs.Property1=SomeValu1;
         ObjPriargs.Property2=SomeValu2;
         MasterPagebuttonClick.Invoke(ObjPriargs);
     }
}
.
.
.
public class CustomEventArgs
{
      Public DataType Property1{get;set;}
      Public DataType Property2{get;set;}
      Public DataType Property3{get;set;}
}
.
.
.
//    Now in your aspx Page
MyMaster m=Page.Master as MyMaster;
m.MasterPagebuttonClick =new MasterPageButtonHandler(MasterPageHandler_Click);
.
.
.
protected void MasterPageHandler_Click(CustomEventArgs ObjPriargs)
{
    //You code/////
}
  

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

Комментарии:

1. Я действительно ценю ваш концерт.. но вы рекламируете свой блог: S: D !!?

Ответ №3:

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

MasterPage html:

<asp:Calendar ID="calAgenda" DefaultView="Days" Format="dd/MM/yyyy" runat="server" BackColor="White" CssClass="templeteCalendar" Visible="false" OnSelectionChanged="calAgenda_SelectionChanged"></asp:Calendar>

ContentPage html:

<asp:TextBox runat="server" ID="txtFechaBusqueda" CssClass="form-control templeteLabel" MaxLength="10" />

C #-код MasterPage:

 protected void calAgenda_SelectionChanged(object sender, EventArgs e)
{
    TextBox txtCalendarDate = (TextBox)ContentPlaceHolder1.FindControl("txtFechaBusqueda");
    txtCalendarDate.Text = calAgenda.SelectedDate.ToString().Substring(0, 10);
}
  

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

C #-код страницы содержимого:

 Calendar btnCalendar = Master.FindControl("calAgenda") as Calendar;
btnCalendar.SelectionChanged  = new EventHandler(btnCalendar_Click);
  

Затем нам нужно определить функцию btnCalendar_Click.

 protected void btnCalendar_Click(object sender, EventArgs e)
{
    DoSomething();
}