Как переопределить одну и ту же функцию на нескольких страницах ASP.NET (функция рендеринга) - PullRequest
5 голосов
/ 26 января 2011

Возьмите следующий сценарий. У меня есть несколько страниц ASPX. Вход в систему, выход из системы, Main, Messages и т. Д. Все они наследуются от System.Web.UI.Page. Для всех страниц я хочу переопределить метод Render из класса Page. Я мог бы легко скопировать и вставить один и тот же код на каждую страницу примерно так:

protected override void Render(HtmlTextWriter writer)
{
     //Code Logic Here
}

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

Это заставило меня немного подумать, и я подумал, хорошо, давайте попробуем это ... переопределить функцию на каждой странице, но вызвать статическую функцию. Таким образом, изменение статической функции приведет к изменению для каждой страницы. Который работает хорошо ... Но это не очень красиво и чисто, приходится так переопределять на каждой странице. У кого-нибудь есть идеи или мысли по этому поводу? Возможно что-то простое, что я пропускаю? Спасибо

РЕДАКТИРОВАТЬ: Некоторые страницы используют класс System.Web.UI.Page, а некоторые страницы наследуются от другого класса, называемого ModifiedPage, который наследует и переопределяет другие функции класса System.Web.UI.Page. Так что это не так просто, как наследовать все страницы из одного класса.

РЕДАКТИРОВАТЬ2: Такое поведение требуется всем страницам, некоторые уже происходят из другого класса, и я не могу изменить иерархию реализации или наследования этого другого класса.

Ответы [ 3 ]

12 голосов
/ 26 января 2011

Вместо того, чтобы наследовать от System.Web.UI.Page, пусть все они наследуются от MyProject.MyBasePage, который наследуется от Page:

public abstract class MyBasePage : System.Web.UI.Page
{
    protected override void Render(HtmlTextWriter writer)
    {
        //Code Logic Here
    }
}

и ...

public partial class MySpecificPage : MyBasePage
{
}

Редактировать

Пояснение, добавленное к вопросу, теперь указывает на реальную загадку - страницы, для которых нужна общая логика рендеринга, имеют разные пути наследования.Это более сложно в C #, и вы не сможете избежать хотя бы небольшого количества избыточного кода.Есть много разных способов справиться с этим - вот один из подходов, который я использовал в прошлом:

1) Создайте интерфейс для этой общей функциональности.Например, IOverrideRender:

public interface IOverrideRender
{
    void Register(OverrideRender render);
}

public delegate void OverrideRender(HtmlTextWriter writer, Action<HtmlTextWriter> original);

2) Каждая страница, которой требуется эта функциональность, получает интерфейс и подключает его следующим образом:

public partial class MyPage : Page, IOverrideRender
{
    void IOverrideRender.Register(OverrideRender render)
    {
        this.overrideRender = render;
    }

    private OverrideRender overrideRender;

    protected override void Render(HtmlTextWriter writer)
    {
        if(overrideRender != nul)
        {
            overrideRender(writer, base.Render);
        }
        else
        {
            base.Render(writer);
        }
    }
}

3) В HttpModule, проверьте, является ли обработчик IOverrideRender, и если да, передайте свой собственный метод рендеринга:

public class OverrideRenderModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += this.HandlePreRequestExecute;
    }

    private void HandlePreRequestExecute(object sender, EventArgs e)
    {
        HttpApplication app = (HttpApplication)sender;
        IOverrideRender overridable = app.Context.CurrentHandler as IOverrideRender;
        if(overridable != null)
        {
            overridable.Register(
                (writer, original) => {
                    writer.Write("Hello world"); //custom write
                    original(writer); //calls base.Render
            });
        }
    }
}
1 голос
/ 26 января 2011

Добавьте уровень в вашей иерархии и сделайте BasePage и сделайте там переопределение, затем наследуйте все остальные страницы от BasePage

1 голос
/ 26 января 2011

Вы должны создать BasePage, который наследуется от System.Web.UI.Page. В BasePage вы можете переопределить метод Render, а затем все ваши страницы наследуются от BasePage.

...