Вызов оригинальной функции Page_Load из встроенного кода - PullRequest
8 голосов
/ 07 июля 2011

Мне нравится Monkey пропатчить веб-сайт ASPX, чтобы я мог добавить материал к методу Page_Load в скомпилированной сборке.

Моей первой мыслью было добавить тег сценария, содержащий второй метод Page_Load, в файл ASPXвот так:

<script language="CS" runat="server">
void Page_Load(object sender, System.EventArgs e) 
{
     // do some stuff in addition to the original Page_Load method
}
</script>

Но похоже, что будет выполнен только метод Page_Load из встроенного кода, а не тот из исходного файла code-behind (в скомпилированной сборке).

Можно ли вызвать оригинальный метод из моего встроенного кода?Или есть какой-то другой способ добавить материал, который должен запускаться сразу после вызова метода Page_Load из встроенного кода без изменения существующей сборки?

Ответы [ 4 ]

10 голосов
/ 07 июля 2011

Модель asp.net заключается в том, что страница, объявленная в файле .aspx, фактически является классом-потомком класса, который наследуется от System.Web.UI.Page, объявленного в файле .aspx.cs.

Итак, ваш Page_Loadметод вызван, потому что он в основном скрывает оригинальный метод Page_Load.Следуя этой логике, вы можете сделать следующее:

<script language="CS" runat="server"> 
void Page_Load(object sender, System.EventArgs e)  
{      
   base.Page_Load(sender, e);
   // do some stuff in addition to the original Page_Load method 
} 
</script> 

Нет проблем с доступностью, потому что asp.net по умолчанию объявляет Page_Load и методы, аналогичные protected, поэтому классы-потомки могут вызывать их.

3 голосов
/ 07 июля 2011

Да, это:

void Page_Load(object sender, System.EventArgs e) 
{
     // Do some things before calling the original Page_Load
     base.Page_Load(sender, e);
     // Do some things after calling the original Page_Load
}

Причина, по которой это работает, заключается в том, что платформа ASP.Net работает на модели, в которой файл .aspx компилируется в класс, который наследуется от класса, определенного в вашем файле кода (на самом деле это класс, определенный Inherits). атрибут на странице тега)

<%@ Inherits="WebApplication1._Default" ... 
0 голосов
/ 07 июля 2011

Это работает для меня.

<script language="CS" runat="server"> 
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        Response.Write("additional stuff");
    } 
</script>
0 голосов
/ 07 июля 2011

Вы также можете попробовать использовать метод PreLoad.Те, кого вызывают до Page_Load, могут быть более чистым способом решения проблем.

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