توجه: این یادداشت قدیمی و مربوط به وبلاگ‌های پیشین است. برای اطلاعات بیشتر آنچه گذشت را بخوانید.


چند روز پیش بعد از انجام کامل یک پروژه و کامپایل نهایی و آپلود کردن فایل های تست به یک مشکل عجیب و غریب برخوردم. من برای سیستم خودم یک صفحه Login داشتم. دو تکست باکس برای وارد کردن نام کاربری و کلمه عبور و یک دکمه که عملیات ورود به سیستم را در رویداد click آن نوشته بودم. روی کامپیوتر خودم همه چیز درست بود ولی وقتی فایل ها رو آپلود کردم و خواستم لاگین کنم هیچ اتفاقی نمی افتاد در واقع فرم من اصلا ارسال نمی شد !

این برای من موضوع عجیبی بود با توجه به اینکه این مشکل فقط در IE وجود داشت و در فایرفاکس مشکلی نبود ( اینم تبلیغ برای فایرفاکس ;) ). خلاصه شروع کردم به پرسیدن از این و آن برای رفع مشکل. برای چند نفری آفلاین گذاشتم. به چند گروه یاهو که در آن ها عضو بودم سر زدم و مشکل را پست کردم. همین طور برای گروه برنامه نویسی asp.net  در گروه های گوگل. دست آخر هم پستی داشتم به انجمن های asp.net. دوست عزیزی هم لطف کرد و یک ارسال به انجمن های پرشین تولز برایم انجام داد. با چند نفری هم آنلاین در این مورد صحبت کردم. از جمله داریوش تصدیقی که اتفاقا آن موقع شب آنلاین بود.

از آن جا که من در صفحاتم از Required field validator استفاده کرده بودم به نظر می رسید که مشکل از همین کتابخانه اعتبارسنجی جاوایی باشد ( منظورم WebUIValidation.js ) است. با راهنمایی آقای تصدیقی سری زدم به فولدر aspnet_client تا نسخه این فایل رو بررسی کنم. روی سرور مورد بحث 3 نسخه از این فایل وجود داشت. علاوه بر نسخه 1_1_4322 ( که نسخه مورد نیاز بود ) دو ورژن دیگر هم وجود داشت که قدیمی تر بودند. بعد از پشتیبان گرفتن از این فایل ها آن ها را به جز نسخه اصلی از روی سرور پاک کردم. صفحه رو دوباره امتحان کردم. فرقی نکرده بود.

در فاصله یک ساعتی که مشغول این کارها و جستجو در وب بودم یکی دو جواب برای پست هایم آمده بود. خانم زاهدی از گروه برنامه نویسان asp.net در یاهو پیشنهاد کرده بودند که به جای Push button از Link button استفاده کنم. اما مهم ترین راه حل که این آقا در انجمن های asp.net منو به طرفش راهنمایی کرد اینجا بود. یادداشتی از Scott Mitchell در همین مورد.

راه حل :

به گفته scott وقتی سورس صفحه رو برای دیباگ کردن نگاه می کنیم به کد مشکل ساز زیر می رسیم :

حالا اگر ایونت هندلر ValidatorOnSubmit مقدار false برگرداند می توانید حدس بزنید که چه اتفاقی می افتد. اجازه بدهید به سورس ValidatorOnSubmit در فایل WebUIValidation.js نگاهی بیندازیم:

function ValidatorOnSubmit() {
     if (Page_ValidationActive) {
         return ValidatorCommonOnSubmit();
     }
     return true;
}

همان طور که می بینید مشکل از جای دیگری ( در واقع تابع ValidatorCommonOnSubmit ) پیش می آید که مقدار بازگشتی تابع ValidatorOnSubmit را مشخص می کند. این تابع به صورت زیر پیاده سازی شده :

function ValidatorCommonOnSubmit() {
      event.returnValue = !Page_BlockSubmit;
      Page_BlockSubmit = false;
}

مشکل کوچکی هست و آن اینکه آیا این تابع نباید یک مقدار return  کند ؟ بعد از گوگل کردن validatoronsubmit returning false به یادداشتی در وبلاگ Thomas Freudenberg می رسیم که مشکلی مشابه را بررسی می کند. این مشکل به یک hotfix مربوط به فریم ورک 1.1 برمی گردد.
اگر تابع ValidatorCommonOnSubmit مانند بالاست ValidatorCommonOnSubmit باید مقدار !Page_BlockSubmit  را برگرداند ( همان طور که در تابع می بینید مقدار Page_BlockSubmit قبلا false شده است ).

اگر این hotfix را نصب کرده اید باید تابع ValidatorCommonOnSubmit را به صورت زیر به روز رسانی کنید:

function ValidatorCommonOnSubmit()
{
    event.returnValue = !Page_BlockSubmit;
    ret_Val = !Page_BlockSubmit;
    Page_BlockSubmit = false;
    return ret_Val;
}

منبع : http://scottonwriting.net/sowBlog/posts/2943.aspx

OpenID در ASP.NET

دسامبر 27, 2007

OpenID چیست؟

OpenID وقتی در گوگل یا یاهو یک حساب کاربری باز می‌کنید با استفاده از همان حساب کاربری می‌توانید از ده‌ها سرویس استفاده کنید، ایده OpenID این است که شما در myOpenID ثبت‌نام کنید و هر وقت به یکی از سایت‌هایی که از OpenID پشتیبانی می‌کند بروید می‌توانید برای ورود به سایت و بهره گرفتن از سرویس آن سایت از اکانت OpenID خود استفاده کنید. اینجا و اینجا می‌توانید لیستی از سایت‌هایی که از OpenID پشتیبانی می‌کنند را پیدا کنید.

OpenID در پروژه دات‌نتی من

اگر علاقمند شدید از OpenID در پروژه خود استفاده کنید، چند پیاده‌سازی دات‌نتی وجود دارد که احتمالا به درد می‌خورند:

.net OpenID
NerdBank ASP.NET OpenID control
ExtremeSwank OpenID Consumer

اولین راه حل یعنی.net OpenIDکاری است از بزرگان asp.net مثل Jason Alexander , Scott Hanselman, Scott Watermasysk که البته چند ماهی هست که نسخه جدیدی از آن منتشر نشده، دومی از JanRain استفاده می‌کند و سومین پیاده سازی هم که گزینه خوبی است از OpenID 1.1 , 2.0 پشتیبانی می‌کند.

مایکروسافت برای برنامه‌نویسان ASP.NET فریم ورک AJAX خود را پیشنهاد می‌کند. مثال ساده و در واقع HelloWorld برنامه‌های ای‌جکسی معمولاٌ برنامه‌ای است که زمان را نشان می‌دهد.

برای شروع با ASP.NET AJAX ابتدا ملزومات آن را (برای VS 2005) از این آدرس دانلود کنید. توجه کنید که برای ASP.NET 3.5 نیاز به دانلود چیزی ندارید. بعد از نصب ASP.NET AJAX برای ASP.NET 2.0  ویژوال استودیو خود را باز کنید، به قالب‌های بخش وب سایت یک قالب جدید به نام ASP.NET AJAX-Enabled Web Site اضافه شده است.

p1

یک پروژه جدید از این نوع را شروع کنید. حالا به مد Design صفحه Default.aspx خود بروید و از Toolbox یک UpdatePanel روی صفحه drag کنید. اکنون یک دکمه و یک label درون UpdatePanel و یک label‌ دیگر خارج از UpdatePanel قراردهید.

p3

حالا به بخش کد می‌رسیم. جایی که برای نشان دادن قابلیت AJAX هر دو label روی صفحه باید زمان جاری را نشان دهند. در Page_Load صفحه خود کد زیر را بنویسید:

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

حالا اگر پروژه را اجرا کنید در ابتدای لود شدن صفحه هر دو label‌ یک زمان و تاریخ را نشان می‌دهند ولی اگر روی دکمه کلیک کنید، می‌بینید بدون ارسال مجدد صفحه به سرور، متن label که درون UpdatePanel قرار دارد با ساعت فعلی به روز می‌شود. این مثال ساده به خوبی چگونگی عملکرد AJAX را نشان می‌دهد.

Agile Tools for .NET

آگوست 1, 2007

توجه: این یادداشت قدیمی و مربوط به وبلاگ‌های پیشین است. برای اطلاعات بیشتر آنچه گذشت را بخوانید.


هر چند که اساتید فرمودند که بی‌خیال این جینگول‌بازی‌ها شویم، اما امروز توی فیدریدر لینکی دیدم به این صفحه که ابزارهای مورد نیاز برای Agile based Development در مایکروسافت دات نت را لیست کرده است. بیشترشان هم مجانی هستند. حیفم آمد معرفی نکنم، ولی شما استفاده نکنید!

Facebook.NET

جولای 19, 2007

آقای Nikhil Kothari که از کله‌گنده‌های ASP.NET هستند، یک framework برای توسعه برنامه‌های فیس‌بوک به کمک ASP.NET ساخته‌اند به نام Facebook.NET. البته هنوز در اول راه هست و قراره قابلیت‌های دیگری به تدریج به آن اضافه شود.

مرتبط: صفحه پروژه Facebook.NET در Code Plex
توضیحاتی درباره این پروژه در وبلاگ آقای Kothari

توجه: این یادداشت قدیمی و مربوط به وبلاگ‌های پیشین است. برای اطلاعات بیشتر آنچه گذشت را بخوانید.


ASP.NET 2.0 سرویس‌هایی دارد مثل Membership, Role Management, Personalization که اطلاعاتی از آن‌ها باید در دیتابیس ذخیره شود،‌ در این مطلب قصد دارم راهی برای تنظیم SQL Server 2000 برای این قابلیت‌های ASP.NET 2.0 معرفی کنم.

مایکروسافت یک ویزارد برای تنظیم SQL Server برای ASP.NET 2.0 در نظر گرفته است که برای استفاده از آن باید به Command Prompt مربوط به Visual Studio 2005‌ بروید و دستور aspnet_regsql را تایپ کنید. بعد از اجرا یک ویزارد به نام ASP.NET SQL Server Setup Wizard‌ برای شما باز می‌شود که به کمک آن می‌توانید دیتابیس دلخواهی را برای استفاده از جداول سرویس‌های ASP.NET 2‌ تنظیم کنید. بعد از اتمام عملیات 11 جدول به دیتابیس شما اضافه می‌شود که همه آن‌ها با aspnet‌ شروع می‌شود (مثلا aspnet_Applications یا aspnet_Membership و ..)
البته اگر از سوییچ‌های مربوط به دستور aspnet_regsql‌ استفاده کنید می‌توانید هر کدام از سرویس‌ها را که بخواهید اضافه کنید. مثلا دستور aspnet_regsql.exe -E -S localhost -A mp جداول مربوط به سرویس‌های Membership و Profile‌ را به سرور لوکال‌هاست اضافه می‌کند. توضیحات کامل در مورد این دستور را اینجا ببینید.

پ.ن: یک domain‌ یرای سایت شخصی‌ام ثبت کرده‌ام و از این به بعد مقالات و نکات مربوط به برنامه‌نویسی را آنجا می‌نویسم و مطالب غیرتخصصی را اینجا در وبلاگ. البته هنوز هیچ کدی برای سایت شخصی ننوشته‌ام پس کمی باید صبر کنید.

Kilter

اکتبر 9, 2006

Kilter یا Kill Filter‌ (!) نامی است که برای پروژه جدیدم انتخاب کردم: یک صفحه ساده asp.net که کمک می‌کند از فیل.تر عبور کنید. دلیل نوشتن این صفحه هم این بود که این فیل.ترینگ مخابرات دیگر داشت اساسی روی اعصابم راه می‌رفت.

ایده اصلی این است که صفحه را روی سروری که asp.net پشتیبانی می‌کند آپلود کنید و بعد سایت مورد نظر را درخواست کنید و درخواست از طریق آن سرور به شما نمایش داده شود و این یعنی proxy. من از از امکانات فضانام System.Net در دات‌نت 1.1 استفاده کردم و کد زیر رو برای فراخوانی سایت مورد نظر نوشتم: 

string url=txtUrl.Text;
WebClient client=new WebClient();
UTF8Encoding output=new UTF8Encoding();
lblOutput.Text = output.GetString(client.DownloadData(url));  

همان‌طور که می‌بینید خروجی (کد HTML‌ سایت درخواست شده) از طریق یک label نمایش داده می‌شود. می‌توانید آدرس سایت را در QueryString‌ هم قرار بدهید و بعد از لود اولیه هر وقت روی لینکی کلیک شد،‌ دوباره تابع بالا فراخوانی شود. البته فراموش نکنید که آدرس را حتما رمز کنید در غیر این صورت با پیغام “مشترک گرامی …” مواجه خواهید شد (;

نسخه اولیه Kilter در حال حاضر بدون مشکل کار می‌کند، فقط url ها باید کامل باشند. البته به نظرم روش زیاد جالب و سریعی نیست ضمن اینکه هنوز بعضی چیزها را پشتیبانی نمی کند و خلاصه اینکه جا برای کار دارد.
درباره پیاده‌سازی چنین پروژه‌ای با دات‌نت ایده بهتری دارید؟ ممنون می‌شوم اگر نظرتان را در کامنت بگویید یا به hameds [at] gmail [dot] com بفرستید.

پ.ن: صفحه 530 بایتی(!) Kilter را روی سروری آپلود کردم. البته آدرسش را نخواهید چون باید عرض کنم که این‌ یک پروژه (و البته کنجکاوی) شخصی است، هر چند به کمک 4 خط کد بالا می‌توانید یک نمونه‌اش را بنویسید.

توجه: این یادداشت قدیمی و مربوط به وبلاگ‌های پیشین است. برای اطلاعات بیشتر آنچه گذشت را بخوانید.


در دات نت 1.1 به کمک System.Web.Mail خیلی راحت می توانید ایمیل ارسال کنید. البته قابلیت هایش در مقایسه با بعضی کامپوننت ها زیاد نیست ولی خب کار را راه می اندازد. ارسال ایمیل فارسی نکته ظریفی دارد. باید توجه کنید که چه بدنه نامه تان با فرمت HTML می فرستید و چه به صورت متن معمولی، مثل صفحات وب فارسی که بر اساس استاندارد یونیکد UTF-8 ساخته می شوند، متن ارسالی شما هم باید چنین فرمتی داشته باشد.

حالا در عمل فرض کنید نقی می خواهد به تقی ایمیل فارسی بفرستد.کد ارسال ایمیل که خیلی ساده است را در زیر می بینید. قسمت های bold شده هم مربوط به همان نکات ظریف ارسال متن فارسی هستند که گفتم.

// ابتدا یک شی از کلاس مورد نظر بگیرید
MailMessage mail = new MailMessage();
// فرستنده و گیرنده و موضوع نامه را مشخص کنید
mail.From = "naghi@gholi.com";
mail.To= "taghi@gholi.com";
mail.Subject = "Persian Email Test";

// برای ارسال متن های فارسی این دو خط کد را لازم دارید
mail.BodyFormat = MailFormat.Html;
mail.BodyEncoding = System.Text.Encoding.GetEncoding( "utf-8" );
// متن ایمیل را مشخص کنید
string text="تست فارسی
چطوری تقی ؟
اردتمند نقی";
mail.Body = text;

// smtp server حالا
SmtpMail.SmtpServer = "";
// در نهایت ایمیل را ارسال کنید
SmtpMail.Send( mail );

کد بالا را می توانید مثلا در تابع مربوط به کلیک کردن روی یک دکمه ( همان دکمه ارسال ایمیل ) بنویسید. در ضمن این سایت هم برای شناخت قابلیت های کلاس ایمیل در دات نت خیلی مفید است.

حاشیه : کفگیر یادداشت های برنامه نویسی ام به ته دیگ خورده و بنابراین از این یادداشت های خنک می نویسم ! باید فکری بکنم. همه اش هم تقصیر چند نفر است.