۱۳۸۸/۰۳/۱۵

نمايش يك پيغام به كاربر در ASP.Net


عموما در برنامه‌هاي وب مرسوم است كه پيغام به كاربر را در همان لابلاي html صفحه نمايش مي‌دهند. مثلا يك برچسب و سپس تنظيم متن آن در كد برنامه به صورت پويا.
با استفاده از پلاگين‌هاي jQuery اين‌كار را به صورت شكيل‌تري مي‌توان انجام داد. براي مثال:


پلاگين كم حجمي براي اين منظور موجود است به نام jQuery Notice (يكي از چند ده نمونه موجود)
<script type="text/javascript">
$(document).ready(function()
{
jQuery.noticeAdd({
text: 'پيغامي به كاربر',
stay: false
});
});
</script>
كمي اين پلاگين را اصلاح كردم تا مشكل عدم نمايش آن هنگام اسكرول طولاني صفحه در IE حل شود (به صورت پيش فرض با فايرفاكس مشكلي ندارد). براي مثال اين div را در نظر بگيريد:
<div id="myElement" style="position: absolute">This stays at the top</div>
قصد داريم مكان آن‌را در بالاي صفحه ثابت كنيم (حتي با يك اسكرول طولاني مانند تصوير فوق، باز هم همان بالا باقي بماند و قابل مشاهده باشد).
با استفاده از jQuery اين‌كار به صورت زير قابل انجام است:
<script type="text/javascript">
$(document).ready(function()
{
$(window).scroll(function() {
$('#myElement').css('top', $(this).scrollTop() + "px");
});
});
</script>
زمانيكه scroll ايي در window جاري صورت ‌گيرد، div ايي با id مساوي myElement يافت شده و سپس مقدار top آن تنظيم شده و در بالاي صفحه نمايش داده مي‌شود.

ولي اين روش جهت نمايش پيغامي پويا به كاربر مشكل دارد.
نياز است به ازاي هر پيغام پويا يكبار به نحوي اين اسكريپت به صفحه تزريق شود كه روش انجام كار در ASP.Net به صورت زير مي‌تواند باشد:

using System;
using System.Web.UI;
using System.Web;

public class CAddJqueryNotice
{
/// <summary>
/// نمايش يك پيغام بر اساس پلاگين نوتيس
/// </summary>
/// <param name="title">عنوان</param>
/// <param name="msg">پيغام</param>
/// <param name="rtl">راست به چپ؟</param>
/// <param name="duration">مدت زمان نمايش</param>
/// <param name="autoHide">به صورت خودكار بسته شود؟</param>
public static void Show(string title, string msg, bool rtl, int duration, bool autoHide)
{
string scriptBlock
= string.Format(@"<script type=""text/javascript"">
$(document).ready(function() {{
jQuery.noticeAdd({{
text: '<b>{0}</b><br/><div align=left dir={1}>{2}</div>',
stay: {3},
stayTime: {4}
}});
}});
</script>",
title,
(rtl ? "rtl" : "ltr"),
msg,
(autoHide ? "false" : "true"),
duration);

if (HttpContext.Current == null || HttpContext.Current.Handler == null) return;
Page page = HttpContext.Current.Handler as Page;
if (page != null)
page.ClientScript.RegisterStartupScript(
page.GetType(),
"script" + new Guid().ToString("N"),
scriptBlock,
false);
}

}
از آنجائيكه در يك كلاس ديگر خارج از صفحه اصلي مشغول به كار هستيم، دسترسي مستقيم به شيء Page و سپس متد ClientScript.RegisterStartupScript آن جهت تزريق اسكريپت خود به صفحه نداريم. اما با استفاده از HttpContext.Current.Handler مي‌توان به اين مقصود رسيد و مشكل حل مي‌شود.

براي آزمايش آن يك دكمه را در صفحه قرار داده و در روال رخ‌داد گردان كليك آن كد زير را اضافه كنيد:
CAddJqueryNotice.Show( "لطفا دوباره سعي كنيد", "مشكلي رخ داده است", true, 2000, true);

بديهي است قبل از استفاده از كد فوق، بايد چند سطر زير را به هدر master page سايت خود اضافه كنيد:
<script src="jquery-1.3.2.js" type="text/javascript"></script>
<link href="jquery.notice.css" type="text/css" media="screen" rel="stylesheet" />
<script src="jquery.notice.js" type="text/javascript"></script>