۱۳/۱۲/۲۰۱۱ ۱۷:۰۳ یا لحظاتی پیش ، کدام قابل درک تر است ؟

بحث کاربرپسند بودن طراحی ها ذهن ها رو به سمت گرافیک وب سایت و یا اپلیکشن سوق می ده اما کاربرپسند بودن تنها در گرافیک خلاصه نمیشه . نحوه ارائه اطلاعات هم بخشی از این داستانه . روش های مختلفی برای بیان یک مطلب وجود داره و مسئله ای که تعیین کننده برتری یک روش است سرعت آن در تفهیم منظور به گیرنده است . هممون می دونیم که یک تصویر جای هزاران کلمه رو می تونه پر کنه .

امروز به وب سایتی برخوردم که تاریخ انتشار کامنت کاربران رو به جای اینکه در قالب ۱۳/۱۲/۲۰۱۱ ۱۷:۰۳ نشون بده از اصطلاحات روزمره ای که بکار می بریم استفاده کرده بود مثل “چند لحظه پیش” یا “یک ساعت پیش” و… . به نظرم جالب اومد . کاربران با دیدن این تاریخ ها خیلی سریع متوجه زمان انتشار کامنت می شن در مقایسه با قالب همیشگی تاریخ یا حداقل کاربران تنبل مثل من  . این می تونه مثالی از یک طراحی رابط کاربرپسند باشه .

من هم تصمیم گرفتم برای خودم همچین کدی رو بنویسم و استفاده کنم . کار سختی نیست . یک سری شرط بصورت if و switch و نه بیشتر . سورس و dll رو برای استفاده کسانی که دوست دارن اینجوری تاریخ رو نشون بدن برای دانلود گذاشتم . البته این کلاس طوری است که در صورتی که تفاوت زمانی کمتر از ۳۰ روز باشه به صورت اصطلاحی نشون می ده و بیشتر از اون رو خود تاریخ ارسال شده رو به صورت رشته برمیگردونه .

+ سورس و dll

اگر سورس رو دستکاری کنید که هیچ اما اگر از dll استفاده کردید روش استفاده به صورت ذیل ! می باشد :

- اضافه کردن dll به پوشه bin پروژه ( از طریق کپی و پیست یا دادن رفرنس )

- در صفحه ای که می خواید از این کلاس استفاده کنید فضانام Royasaz.OpenSource رو اضافه کنید .

- کلاسی به نام FriendlyDate در اون صفحه در دسترس قرار می گیره . این کلاس تنها یک تابع به نام Convert داره که یک تاریخ میلادی در قالب DateTime رو می گیره و اصطلاح متناسب رو در قالب رشته برمی گردونه . ایراد کار همینجاست که اگه تاریخ تون در قالب شمسی است اول باید اونرو به میلادی تبدیل کنید و بعد به تابع بفرستید .


using Royasaz.OpenSource;

DateTime DateInPast=new DateTime(2011,12,12,12,12);

Response.Write(FriendlyDate.Convert(DateInPast));

نیاز به گفتن هم نیست که این کلاس کامل نیست و جای کار زیاد داره .

Posted in ASP.Net, اشتراک گذاری | Tagged , , | ۲ Comments

چرا UpdatePanel خطرناک است ؟

همه ما که با ASP.NET کار می کنیم از سادگی بهره بردن از قابلیت های AJAX با استفاده از کنترل UpdatePanel لذت می بریم . و بعضی مواقع نمی تونیم از وسوسه استفاده از چندین و چند UpdatePanel در یک صفحه مقاومت کنیم . اما متأسفانه شفاف نبودن آنچه در تبادلات بین سرور و کلاینت روی می دهد می تواند باعث بوجود آمدن مشکل برای سایت شود .

بهتر است با یک مثال جلو برویم که همه با آن آشنا هستیم :

<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel runat="server" ID="up1">
 <ContentTemplate>
   <asp:Label runat="server" ID="Label1" Text="Update Me!" /><br />
   <asp:Button runat="server" ID="Button1"
     Text="Postback Update" OnClick="Button1_Click" />
 </ContentTemplate>
</asp:UpdatePanel>

و

 

 

protected void Button1_Click(object sender, EventArgs e)
{
  Label1.Text = DateTime.Now.ToLongDateString();
}

به همین سادگی . یک کلید فشرده می شود . یک درخواست غیرهمزمان برای زمان و تاریخ جاری ارسال می شود و نتیجه در یک Label نشان داده می شود . حال نگاهی به پشت صحنه می اندازیم و HTTP Post و  Response مربوط به این عملیات را بررسی می کنیم .

 

 

 

شوکه کننده است . نه ؟ برای نمایش یک رشته ۲۲ کاراکتری ، این حجم از تبادل داده بسیار زیاد است . شاید برای استفاده معدود و سبک قابل قبول باشد اما در وب سایت های با عملیات های سنگین و بار زیاد باعث دردسر خواهد شد .

خوشبختانه microsoft یک ابزار دیگر رو برای انجام اینگونه عملیات ها در چارچوب فریمورک AJAX.Net در اختیار ما قرار داده ، Page Methods.

Page Method ها این اجازه رو به صفحات AJAX می دن تا مستقیماً توابع static یک صفحه رو با استفاده از JSON اجرا کنن . بجای انجام یک postBack و سپس دریافت کدهای جدید HTML برای جایگزینی کامل محتویات یک UpdatePanel ، می تونیم با استفاده از Page Method فقط همون اطلاعاتی رو که موردنیازمون هست درخواست و دریافت کنیم .

 

<asp:ScriptManager ID="ScriptManager1" runat="server"
  EnablePageMethods="true" />
<script language="javascript">
 function UpdateTime() {
   PageMethods.GetCurrentDate(OnSucceeded, OnFailed);
 }

 function OnSucceeded(result, userContext, methodName) {
   $get('Label1').innerHTML = result;
 }

 function OnFailed(error, userContext, methodName) {
   $get('Label1').innerHTML = "An error occured.";
 }
</script>
<asp:Label runat="server" ID="Label1" Text="Update Me!" /><br />
<input type="button" id="Button2" value="Web Method Update"
  onclick="UpdateTime();" />

 

و

 

[WebMethod]
public static string GetCurrentDate()
{
  return DateTime.Now.ToLongDateString();
}

 

با این روش ما داده هایی رو که در  استفاده از UpdatePanel توسط HTTP Post ارسال می شدن کاملاً حذف و  Response رو به آنچه نیاز داریم کاهش دادیم .

 

 

در این روش و با استفاده از JSON مقدار کل داده های منتقل شده تنها ۲۴ بایت میشه که در مقایسه با ۸۲۷ بایت روش UpdatePanel بسیار کم است .

یک مزیت دیگر این روش هم این است که سرور نیازی به ساخت مجدد کنترل های درون UpdatePanel و طی کردن life-cycle آنها برای رندر کردن کد های HTML  شان ندارد  .

اما در کنار همه این حرف ها هم UpdatePanel مزایای خود را دارد و هم Page Methods معایب خود را .

 

+ مقاله اصلی

 

Posted in AJAX, ASP.Net | Tagged , , | Leave a comment

اسکرول کردن صفحه با JQuery

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

برای این کار در کنار JQuery نیاز به یک پلاگین کوجیک هم داریم که توی سورس هستش .
خوب اول باید یک صفحه با متن بلند داشته باشیم تا نتیجه کار رو خوب نشون بده . بعد از اضافه کردن رفرنس به JQuery و پلاگین در قسمت Head ، کد اسکریپت زیر رو وارد می کنیم :

<script src="jquery.js" type="text/javascript"></script>
<script src="scroll.js" type="text/javascript"></script>
<script>$(function(){
var $elem=$('#content');
$('#nav_up').fadeIn('slow');
$('#nav_down').fadeIn('slow');

$(window).bind('scrollstart',function(){
$('#nav_up,#nav_down').stop().animate({'opacity:'0.2'});
});
$(window).bind('scrollstop',function(){
$('#nav_up,#nav_down').stop().animate({'opacity:'1'});
});

$('#nav_down').click(
function(e){
$('html,body').animate({scrollTop:$elem.height()},800);
}
);
$('#nav_up').click(
function(e){
$('html,body').animate({scrollTop:'0px'},800);
}
);

در کد بالا Content نام المنتی هستش که محتوایی که قراره اسکرول بشه داخل اون قرار داره . افکت جالبی که در اینجا وجود داره اینه که در حین انجام  اسکرول  کلید های بالا و پایین محو می شن .
وقتی که کاربر بر روی کلید پایین کلیک می کنه با استفاده از تابع Animate مقدار ScrollTop المنت والد برابر با ارتفاع Content میشه .  و برای برگشت به بالا مقدار ScrollTop برابر ۰ قرارش می دیم . که البته هر مقدار دیگه ای هم می تونه باشه .
+ دمو
+ سورس

Posted in دسته‌بندی نشده | Leave a comment

بروز رسانی یک UpdatePanel با استفاده از Javascript

بعضی مواقع لازم میشه که یک ,update Panel رو از سمت کلاینت بروز رسانی و رفرش کنیم . روش کار ساده ست :

اول کد HTML :


<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div id="Container">
<asp:UpdatePanel runat="server" ID="UpdatePanel1"
    OnLoad="UpdatePanel1_Load">
  <ContentTemplate>
    <asp:Label runat="server" ID="Label1" />
  </ContentTemplate>
</asp:UpdatePanel>

همونطور که می بینید برای UpdatePanel رویداد onload رو باید هندل کنیم .


protected void UpdatePanel1_Load(object sender, EventArgs e)
{
  Label1.Text = DateTime.Now.ToString();
}

هر وقت که updatepanel لود بشه زمان جاری در Label قرار می گیره . حالا چطور updatepanel  رو از سمت کلاینت لود کنیم ؟

برای اینکار از  doPostBack استفاده می کنیم . وقتی که مقدار پارامتر Event Target مربوط به doPostBack یک Async Trigger تعیین شده برای UpdatePanel باشد ، AJAX framework اون رو تحویل می گیره و یک Partial PostBack رو ایجاد می کنه .

در اینجا ما خود UpdatePanel رو به عنوان EventTarget می فرستیم . تگ div رو بصورت زیر اصلاح می کنیم :


<div id="Container" onclick="__doPostBack('ClientIDOfUpdatePanel1', '');">

باید نام سمت کلاینت UpdatePanel رو در doPostBack قرار بدیم . حالا با هر بار کلیک روی محتوای div که خود UpdatePanel هستش . یک Partial PostBack رخ میده و متن درون Label بروز میشه .

Posted in AJAX, ASP.Net | Tagged , , , | Leave a comment

ساخت منو با استفاده از CSS و JQuery

به دلایل زیادی از منوی Asp.net خوشم نمیاد . استفادش از table ، مشکل داشتن با سمت نمایش Sub menu های پایین تر از سطح دوم . سخت بودن استایل دهی و … من رو کاملاً از استفاده از اون منصرف کرد. برای همین امروز تصمیم گرفتم که خودم یه منو ( دموی منو ) با استفاده از CSS و JQuery بسازم .

منوی ساده ایست ولی خوب قابلیت اضافه کردن افکت ها رو داره . خوبیش هم اینه که براش مهم نیست از چندتا سطح تشکیل شده . با مرورگرهای فایرفاکس ، کروم و اپرا حتماً کار می کنه . IE 6 رو تست نکردم ( ولش کن ) . روی IE7 به بعد هم کار می کنه .

خوب ، برای ساختن این منو مثل همیشه از لیست استفاده کردم . و برای نمایش سطوح از JQuery .

1- تگ های HTML

محتوای HTML مون از یک div با نام Menu و چند لیست تو در تو ( که همون منو باشه ) تشکیل شده . برای هر زیر سطح یک لیست تعریف شده . برای ul سطح اول یه کلاس به نام Static و برای سطوح بعدی کلاسی به نام Dynamic تعریف شده .

<div id="Menu">
<ul>
	<li><a href="#">آیتم یک</a></li>
	<li class="HasSub"><a href="#">آیتم دو</a>
<ul class="Dynamic">
	<li class="HasSub"><a href="#">زیر آیتم یک</a>
<ul class="Dynamic">
	<li><a href="#">زیر آیتم سه</a></li>
	<li><a href="#">زیر آیتم چهار</a></li>
</ul>
</li>
	<li><a href="#">زیر آیتم دو</a></li>
</ul>
</li>
	<li><a href="#">آیتم سه</a></li>
	<li><a href="#">آیتم چهار</a></li>
</ul>
</div>

2- استایل های CSS

برای کلاس Dynamic بصورت پیش فرض display:none قرار داده شده . مقدار margin-right آن به اندازه عرض منو و برای اینکه سطح پایین تر در زمان نمایش هم سطح Parent خود باشد Margin-top نیز برابر با -۴۲ ( ارتفاع هر آیتم به علاوه ۲ پیکسل border بالا و پایین ) تعیین شده است . برای آیتم هایی هم که دارای زیر منو هستن یک کلاس به نام HasSub تعریف شده که در اون می شه یک نشانگر برای مشخص کردن داشتن زیر منو قرار داد ( بصورت بکگراند آیتم ) .

<style>
        body
        {
            direction:rtl;
        }
    #Menu
{
    display:block;
    width:170px;
    border:solid 1px #ccc;

}
#Menu ul
{
     list-style:none;
     width:100%;
     margin:0px;
     padding:0px;
}
#Menu ul.Dynamic
{
     margin-right:171px;
     display:none;
     margin-top:-42px;
     border-top:solid 1px #ccc;
     border-left:solid 1px #ccc;
}

#Menu li
{
      display:block;
      height:40px;
      width:100%;
      border-top:solid 1px #fff;
      border-bottom:solid 1px #E1E1E1;
      background-color:#F7F7F7;
}

#Menu li:hover
{
    background-color:#f1f1f1;
}

#Menu li.HasSub
{
   background-image:url(HasSubArrow.png);
   background-position:10px center;
   background-repeat:no-repeat;
}

#Menu li a
{
    display:block;
    height:2em;
    color:#808080;
    font-family:'b koodak';
    font-size:1em;
    padding-right:10px;
    padding-top:.5em;
}

#Menu li a:hover
{
    color:#000;
}

    </style>

تا اینجای کار منو آماده است اما برای اینکه با قرار گرفتن بر روی آیتم والد زیرمجموعه اون نمایش داده بشه من از JQuery کمک گرفتم .

۳- JQuery

فقط یک تابع هست که در زمانی که نشانگر ماوس بر روی آیتم هایی که دارای کلاس HasSub هستن قرار می گیره میاد و اولین ul زیرمجموعه اون آیتم والد رو به صورت FadeIn نمایش میده . برای این گفتم اولین ul چون اگر این رو تعیین نمی کردم تمام زیرمجموعه ها در تمام سطوح متعلق به اون آیتم والد نمایش داده می شه.


<script type="text/javascript">
$(document).ready( function(){

    $('.HasSub').hover(function(){
        $(this).find('ul:first').fadeIn(500);

    },function(){

    $(this).find('ul:first').fadeOut(500);

    });
});
</script>

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

کد منو رو هم می تونین از اینجا بردارین .

Posted in دسته‌بندی نشده | Leave a comment

حذف چندین رکورد از بانک اطلاعاتی در یک stored procedure

در این آدرس می تونید یک مثال خیلی خوب از نحوه حذف کردن همزمان چندین رکورد از بانک اطلاعاتی طی یک درخواست و با یک stored procedure رو ببینید .

Posted in آموزش, اشتراک گذاری | Tagged | Leave a comment

Steve jobs

استیو جابز درگذشت ….

حرفی نمیشه زد …

 

روحش شاد .

Posted in دسته‌بندی نشده | Leave a comment

دانلود مجلات MSDN

توی این صفحه می تونید لیست مجلات MSDN رو ببینید و اونارو دانلود کنید

Posted in اشتراک گذاری | Tagged , | Leave a comment

ORM چیست ؟

در حین وبگردی به این مقاله برخوردم که مطلب جالبیست درباره ORM . اولین بار هستش که با این کلمه روبرو میشم و به نظرم می تونه خیلی در کیفیت برنامه ها موثر باشه :

 

زمان به ما ثابت کرده که پایگاه داده‌های رابطه‌ای ساختار مناسبی برای ذخیره‌سازی داده‌ای هستند، همچنین به این نتیجه رسیده‌ایم که برنامه‌نویسی شیءگرا یک رویکرد بسیار خوب و قوی برای پیاده‌سازی سیستم‌های بسیار پیچیده می‌باشد.

ORM عملا یک لایه مترجم بین زبان برنامه‌نویسی و پایگاه داده رابطه‌ای است که این دو را به هم تبدیل می‌کند و در عمل باعث می‌شود که این دو حیطه کاملا متفاوت زبان یکدیگر را به خوبی بشناسند و با هم تبادل اطلاعات داشته باشند. این مفهوم که مانند یک پل بین این دو حیطه می‌ماند قابلیت‌های زیادی را برای ما تهیه می‌نماید.
به طور اختصار می‌توان گفت که وظیفه ORM پایدار کردن خودکار آبجکت‌های موجود در یک برنامه روی جداول در پایگاه داده رابطه‌ای می‌باشد که برای این کار از متادیتاهایی برای نگاشت بین آبجکت‌ها و پایگاه داده استفاده می‌نماید.

 

متن کامل مقاله رو اینجا می تونید بخونید .

Posted in ASP.Net, اشتراک گذاری | Tagged | Leave a comment

ساخت یک منو با استایل apple

داشتم دنبال افکت هایی برای منو می گشتم که این آموزش نحوه ساخت یک منو شبیه منوهای apple رو دیدم . چیز جالبه ی . درش از Css و کمی jquery استفاده شده .

+ دموی منو

+ آموزش ساخت منو

Posted in اشتراک گذاری, جی کوئری | Tagged | Leave a comment