ورود

View Full Version : سوال: آیا دسترسی به ابجکت Page در HttpHandler امکان پذیر است؟



mehrdad201
سه شنبه 07 دی 1389, 11:30 صبح
سلام
از داخل یک HttpHandler میخواستم خاصیت title یک Page رو عوض کنم.
همچنین یه سری متاتگ (بسته به ادرس صفحه) به Header اضافه کنم.

اما نمیدونم میشه یا نه ؟ فعلا در حال سرچ هستم . میخواستم ببینم دوستان و اساتید میتونن بنده رو راهنمایی کنن؟

تشکر و سپاس

prankster
سه شنبه 07 دی 1389, 20:45 عصر
دسترسی به Page در HttpHandler؟ بله.
روش مناسبی است؟ خیر
با تعریف HttpHandler برای فایل های aspx عملا default handler صفحات از بین می رود، که علاوه بر ایجاد مشکلات برای برنامه هایی که با default handler کار می کنند، handle کردن صفحه aspx شامل rendering و نوشتن response در pipeline را هم باید انجام دهید

شاید روش بهتر برای این کار استفاده از یک HttpModule باشد که کنترل بهتری را روی pipeline ارائه می کند. در وقفه PreRequestHandlerExecute از یک HttpModule یعنی قبل از handle شدن صفحه توسط handler مربوطه، می توانید به Page دسترسی پیدا کنید. اما از آنجایی که کنترل های Page هنوز توسط engine net. پردازش نشده است دسترسی به اجزای Page امکان پذیر نیست، بنابراین با register کردن یک event مثلا PreRender برای Page می توانید عملیات مورد نظر را انجام دهید:

تعریف event مربوط به PreRequestHandlerExecute در HttpModule:

public void Init(HttpApplication context)
{
context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
}
بدنه event handler:

void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
System.Web.UI.Page page = (HttpContext.Current.Handler as System.Web.UI.Page);

if (page != null)
{
page.PreRender += (s, args) =>
{
page.Title = "blah blah";
};
}
}

mehrdad201
سه شنبه 07 دی 1389, 22:53 عصر
دوست عزیز ضمن تشکر از شما

من این کد رو تست کردم. متاسفانه به هیچو وجه وارد شرط



if (page != null)
{
page.PreRender += (s, args) =>
{
page.Title = "blah blah";
};
}


نمیشود. چون page همیشه مقدار null دارد.

mehrdad201
سه شنبه 07 دی 1389, 22:59 عصر
با عرض شرمندگی.

مشکل رو حل کردم. اشتباه بنده استفاده از رویداد Begin_Request بود که نادرست بود و باید از PreRequestHandlerExecute استفاده میکردم.

باز هم ممنون و سپاسگذارم.