#c# #asp.net #webforms #master-pages
#c# #asp.net #веб-формы #мастер-страницы
Вопрос:
Там больше, чем вопрос и статья об одном и том же точном вопросе, но у меня есть еще пара связанных вопросов, и я надеялся получить ответы на некоторые.
-
Я слышал о двух подходах к поиску кнопки и добавлению обработчика или использованию интерфейса (ознакомьтесь с обоими подходами здесь) .. Какой из них вы предлагаете?
-
Не могли бы вы, пожалуйста, проиллюстрировать параметр «Интерфейс» каким-нибудь кодом и указать, к какому классу отнести файл интерфейса, потому что он не читается на странице, когда я пытаюсь его наследовать!
Ответ №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();
}