Dot net In Blue

دوشنبه، دی ۱۸، ۱۳۸۵

اعلام تعطیلی وبلاگ !

سلام یه خبر خوب برای تمام بازدید کنندگان وبلاگ . متاسفانه همونطور که میبینید مقالات دات نتی روی این وبلاگ درست نمایش داده نمیشه ! به هیچ صراتی هم مستقیم نیست و با هر کلکی میخوای یه کری کنی که کد ها رو سمت راست نشون بده و متن فارسی رو سمت چپ و تمامی نقطه سرخط ها ! رو مثل چیری که تو میخوای نمایش بده تو یکتش نمیره که نمیره . از طرف دیگه اینجانت به علت شروع فعالیت در عرصه بیت المملی (!) در نظر درم وبسایتی اختصاصی به خودم تخصیص دهم که البته بیشتر محتوای آن به زبان شیرین انگلیسی خواهد بود ! ولی قسمتی از سایت را نیز به زبان مادری خودم و هموطنان عزیز اختصاص خواهم داد تا علاوه بر دوباره منتشر کردن مقالات موجود در این وبلاگ و همینطور انتشار کامل مقاله مربوط به ممبر شیپ که قبلا قولش را داده بودم و بسیار هم مفید خواهد بود ! گهگداری مقاله ای دات نتی به زبان شیرین پارسی از خودم منتشر کنم . البته به دوستان توصیه میکنم که قسمت مقالات انگلیسی را در آن سایت دنبال کنند . واضح است که کلماتی که من در نگارش استفاده خواهم کرد از سنگین نبوده و برای دوستان قابل درک خواهد بود . خوشحالم که در این مدت توانستم در این وبلاگ و در وبسایتهای دیگر سهم اندکی در پیشرفت و هدایت مسیر برنامه نویسی دات نت به زبان پارسی داشته باشم . . آدرس : www.rooznamechi.com برای خدمات برنامه نویسی و وبلاگ انگلیسی آدرس : www.persiandev.net برای مقالات برنامه نویسی به فارسی

یکشنبه، آذر ۱۲، ۱۳۸۵

نگاهی دقیق به سرویس شناسایی کاربر در دات نت 2 قسمت نخست

در این سری مقاله میخواهیم درباره سرویس membership و profile در asp.net 2 بحث کنیم ، همانطور که قبلا هم توضیح داده بودم ساختن یک membership در asp.net 2 با درگ کردن چند کنترل از toolbox کنار ویژال استدیو دات نت 2005 به سادگی امکان پذیر است اما بیایید کمی دقیق تر به مسئله نگاه کنیم در این چند مقاله متوالی به صورت دقیق اما موجز به برسی پرافایل و ممبر شیپ در asp.net 2 می پردازیم ، سعی میکنیم در این مقالات تا حد امکان از گفتن جزییات و بدیهیات صرف نظر کنم اما چون این مقالات، مقالاتی پایه می باشند و دوستان در هر سطحی باید از آن استفاده کنند گاهی مجبورم توضیحاتی دهم که ممکن است برای شما امری بدیهی به نظر برسد ! کد ها را با ویژال بیسیک مینویسم (فقط همین یک بار ) چون معمولا دوستانی که C# میدانند از کد های ساده ویژال بیسیک به راحتی سر در می آورند ولی دوستانی که C# نمیدانند معمولا تا C# را میبینند صفحه را میبندند ! و این یک مقاله پایه برای همه است . تعریف membership : ممبرشیب در حقیقت سرویس شناسایی کاربر وب سایت شما است ، در ورژن قبلی asp.net ممبرشیپ تا حدی تعریف شده بود و ما میتوانستیم با برنامه نویسی از این سیستم استفاده کنیم ، در ورژن جاری علاوه بر اینکه سیستم گذشته همچنان پشتیبانی میشود سرویس جدیدی نیز اضافه شده است . در این روش ما نیاز به برنامه نویسی برای شناسایی کاربر نداریم ! در حقیقت کار ها از قبل انجام گرفته است . تعریف role (نقش ) : هر کاربر میتواند در سایت چندین نقش داشته باشد که بسته به این نقش ها دسترسی کاربر به قسمتهای مختلف سایت مجاز یا محدود میشود ، معمولا نقش ها به دو گونه تعریف میشوند :
  • Admin ,PowerUser, NormalUser
  • CanEdit,CanDelete,….
نوع اول کاربران را به مدیر ، ابر کاربر ، کاربر معمولی و... تقسیم میکند ، در این نوع دسترسی دادن معمولا در سایت چند فولدر وجود دارد که هر نوع کاربر به فولدر مخصوص خود دسترسی دارد . در نوع دوم کابران به (میتواند ویرایش کند ، میتواند حذف کند و... ) تقسیم بندی میشوند . چنین دسته بندی معمولا وقتی به کار میرود که بخواهند چندین دسترسی را به کاربری بدهند در صورتی که این دسترسی ها الزاما به کاربر دیگری تعلق نمیگیرد ، برای مثال یک کاربر فقط میتواند ویرایش کند ، یک کاربر فقط میتواند حذف کند و یک کاربر هم ویرایش و هم حذف را در اختیار دارد ( دو نقش Role به خود اختصاص میدهد ). خوب حالا بهتر است وارد عمل شویم و یک سیستم لاگین ساده را به عنوان پایه کارمان باهم ایجاد کنیم ، توجه کنید که حتی یک خط برنامه نویسی هم نخواهیم کرد ! در ویژال استدیو 2005 یک وبسایت جدید ایجاد کنید ، نام آن را membership1 بگذارید و vb.net را به عنوان زبان برنامه نویسی انتخاب کنید . با کلید های Ctrl + Shift + A ( Add new Item ) یک وب فرم جدید به پروژه اضافه کنیدنام آن را Register.aspx بگذارید . از منوی ToolBox سمت چپ ویژال استدیو ، دسته Login ، یک create user name را به داخل صفحه دراگ کنید . (صفحه ثبت نام شما ساخته شد ) یک صفحه جدید دیگر با زدن کلید های Ctrl + Shift + A ایجاد کنید و نام آن را Login.aspx بگذارید ، اینبار از toolbox یک login داخل صفحه درگ کنید، یک لینک هم در این صفحه به صفحه ثبت نام بگذارید . (صفحه لاگین شما هم ساخته شد ) در صفحه default.aspx که هنگام ایجاد پروژه به صورت پیش فرض ایجاد شده بود یک loginName یک LoginStatus و یک loginView را طوری درگ کنید که در هنگام نمایش بتوانید آنها را از هم تشخیص دهید . به محض اینکه نشانگر موس شما روی loginView برود یک مثلث کوچک کنار آن ظاهرمیشود (تصویرزیر: ) روی مثلت کلیک کنید و از داپ دان مقابل Views ، AnonymousTemplate را انتخاب کنید . روی محوطه قابل ویرایش LoginView کلیک کنید و سعی کنید چند در آن قرار دهید (این لینک ها برای تمامی کاربران در دسترس خواهد بود ) حالا دوباره روی مثلث کلیک کنید و از دراپ دان این بار LoggedInTemplate را انتخاب کنید ، دوباره روی محوطه قابل ویرایش LoginView کلیک کنید و سعی کنید چند لینک در آن قرار دهید این لینکها را فقط کاربرانی کع عضو سایت هستند و لاگین کرده اند میتوانند ببینند . اگر همین الان با F5 برنامه را اجرا کنید میبینید که کابری که با آن وارد وینوز شدید به عنوان کاربر لاگین شده شناسایی میشود ، اماچیزی که ما معمولا لازم داریم شناسایی کاربر بر اساس وب فرم ها است نه ویندوز پس از منوی های بالای ویژال استدیو Website را انتخاب کنید و از این منو گزینه asp.net configuration را انتخاب کنید . یک پنجره مرورگر جدیدبه صورت زیر برای شما باز خواهد شد . یکی از کارهایی که این قسمت برای شما انجام میدهد این است که این امکان را به شما میدهد تا بدون نیاز به ویرایش دستی web.config برخی از تنظیمات سایت خود را انجام دهید . روی Security کلیک کنید و در کادر Users مشاهده میکنید که نوشته شده " The current authentication type is Windows. User management from within this tool is therefore disabled. " ، روی Select authentication type کلیک کنید . میخواهیم شناسایی کاربر را از Windows به web Forms تغییر دهیم . بعد از کلیک کردن وارد صفحه ای دیگر میشوید ، دکمه رادیویی From the internet را کلیک کنید و دکمه Done را بزنید . دوباره به صفحه قبلی راهنمایی میشوید ، به کادر Users دقت کنید ! اکنون شما میتوانید کاربر جدید بسازید پس create User را از این کادر کلیک کنید ، توجه کنید که شما برای کلمه عبور نیاز به یک حرف غیر از الفبای عددی دارید (Non-alphanumeric) بعدا خواهید آموخت که چطور تعداد این حروف را افزایش دهید یا حذف کنید فعلا کلمه عبوری مثل "123456&" را انتخاب کنید . و قتی کاربر خود را ساختید پنجره مرورگر را ببنید . حالا با F5 برنامه را اجرا کنید . روی لینک لاگین کلیک کنید ، به صفحه لاگینی که ساخته بودید هدایت میشوید ، با نام کاربری و کلمه عبوری که چند لحظه پیش ایجاد کردید لاگین کنید ، میبینید که به صفحه اول باز میگردید با این تفاوت که loginView به شما لینک های کاربران لاگین شده را نمایش میدهد . و لینک login به logout تبدیل شده است . logout را بزنید و دوباره login را کلیک کنید ، اینبار به قسمت ثبت کاربر جدید بروید و یک کاربر دیگر بسازید ! حالا میخواهیم دو صفحه دیگر به وبسایتمان اضافه کنیم ، بازآوری کلمه عبور و تعویض کلمه عبور : یک وب فرم جدید دیگر به پروژه اضافه کنید نام آن را Changepassword.aspx بگذارید . و کنترل ChangePassword را از toolbox در آن درگ کنید . یک لینک در LoginView صفحه default.aspx قسمت کاربران شناسایی شده به این صفحه بدهید. یک صفحه دیگر ایجاد کنید و نام آن را PasswordRecovery.aspx بگذارید و کنترل PasswordRecovery را نیز از toolbox به این صفحه درگ کنید . در LoginView صفحه default.aspx قسمت کاربران شناسایی نشده به این صفحه و صفحه ثبت نام کاربران لینک بدهید . با F5 دوباره برنامه را اجرا کنید . تا اینجا کمی با کنترل های جدید دات نت 2 آشنا شدیم ، حالا وقت آن است که ببینیم چطور میتوانیم این کنترل هارا فارسی کنیم ، برای نمونه کنترل login را با هم فارسی میکنیم . صفحه login.aspx را باز کنید . سرس این صفحه را ببنید .دوباره به نمای design برگردید ، روی کنترل login رایت کلیک کنید و Properties را انتخاب کنید . از کادر سمت راست:
  • FailureText
  • PasswordLabelText
  • RememberMeText
  • TitleText UserNameLabelText
  • PasswordRequiredErrorMessage
  • UserNameRequiredErrorMessage
را ویرایش کنید و متون فارسی مناسب را در مقابلشان بنوسید . من این کار را برای قسمت لاگین در فایل Membership1 انجام دادم می توانید آن را دانلود کنید و ملاحظه کنید . حالا روباره به نمای Source بروید میبینید که تمام پیامهای فارسی شما آنجا ذخیره شده است . به سادگی نتیجه میگیریم درصورتی که این پیامها تنظیم نشوند پیامهای پیش فرض با زبان انگیلیسی به نمایش در خواهند آمد . کار شما با قسمت شناسایی کاربر پایه تقریبا تمام شده است ، میماند فارسی کردن بقیه فرمها که در صورت تمایل شما به شما کمک میکند بیشتر با این کنترل ها آشنا شوید . خوب تا اینجا برای کسانی که قبلا با دات نت 1 کارکرده اند احتمالا این سوالات پیش خواهد آمد :
  • چطور نام ، نام خانوادگی ، تاریخ تولد و ... را هنگام ثبت نام از کاربر دریافت کنیم
  • چطور به کاربر رول بدهیم
  • چطور با برنامه نویسی اطلاعات کاربر ازجمله نام کاربری را بگیریم
  • اطلاعات کاربر را چطور در دیتابیس خودمان ذخیره کنیم .
  • و...
که جواب تمامی این سوالات را در ادامه خواهیم داد .

یکشنبه، آذر ۰۵، ۱۳۸۵

ثبت نام اینترنتی کارشناسی ارشد

خوب الان با احتمال خوبی میتونم بگم که برنامه نویس ثبت نام اینترنتی کارشناسی ارشد مهندس صنایع بوده چون توی مثال پرکردن
فرم ها مهندسی صنایع رو مثال زده بود از اون دلیل محکم تر عکس زیر رو نگاه کنید
حتما میپرسید چه ربطی به دات نت داشت ! خیلی سادست سایت با دات نت نوشته شده ولی دمش گرم خیلی باحال بود

یکشنبه، آبان ۲۸، ۱۳۸۵

سفری به VB.net

خدا بگم چیکار کنه اون بنده خدایی رو که vb.NET رو اومد قاطی دات نت کرد ! با این سینتکس عجیب و غریبش ! آخه زبون برنامه نویسی میشه سیمی کالن نخواد ؟ مثل این میمونه که غذا بخوری بعد روش آب نخوری ! بابا نمیره پایین ! ما هر زبونی را دیدیم سیسمی کالن داشته ، ANSI c, C++ ,Java ,C#,Pascal و... این همه زبون معتبر همه ; مقدس رو دارن !حالا این هیچی ادیتورشم آخه یه جور دیگست ! به جای انتر باید اسپیس بزنی وگرنه میره سر خط ! حالا اینا رو داشته باشید ! یکی از دوستان به ما یه سفارش داد با VB.net منم نمیدونم چی شد حوس کردم اینبار نگم با #C بهترو و... خلاصه راضیش کنم که #C رو بکار ببریم ! چشمتون روز بد نبینه ! VB رو که باز کردم دیدم او اوه من یه for درست حسابی یادم نیست اینطو چطوری مینویسن ، خوب البته وقتی یکم فکر کردم علاوه بر For خیلی چیز های دیگه هم یادم اومد ! ولی خوب میدونی آدم یه وقتایی با یه چیزایی حال نمیکنه دیگه اینم قضیه ماست و VB. حالا فکر کن دو سه روز هرچی مینوشتم تهش یه سیمی کالن هم میذاشتم ! یه دو هفته ای گذشت و خلاصه ما عادت کردیم به VB امروز اومدم دوباره سر #C ، دوستان چشمتون روز بد نیبینه ! یه تیکه برنامه نوشتم وقتی کامپایلش کردم دیدم اوه اوه چه خبره ! میخواستم پاشم برم، برنامه نویسی رو بذارم کنار و یه شغلی انتخاب کنم که به روحیاتم بخوره مثلا آب دادن گیاهان (دریایی ؟!؟ ) ولی خوب گفتم بذار باگهای این رو هم بگیرم و بعد برم فکر میکنید باگهاش چی بود ! چندین و چند سیسمی کالن نذاشته بودم ، به جای [] از () برای پروپرتی ها استفاده کرده بودم ! خودم باورم نمیشد اینقدر یه نفر آدم تغییر پذیر باشه که بعد از 3 ، 4 سال #C نوشتن با دو هفته VB اینجوری از خود بیخود بشه و یه همچین کاری بکنه ، خوبه دوستان اونجا نبودند وگرنه کلی بهمون میخندیدند ! دوستان هم خوش خنده! وقتی دور هم هستند به درخت چنار هم میخندند چه برسه به یه همچین سوتی ! حالا حتما دارید با خودتون میگید ، مرد مومن ; اگه شانس اوردی و اونا اونجا نبودند حالا چرا اودی جار میزنی که دوستان بفهمند ! جوابش یه کلمه سادست : بذار دوستان هم خوش باشند ! ( این یه کلمه بود ها باید تند خوانی رفته باشی تا بفهمی ! ) خوب مدتی بود اینجا چیزی ننوشته بودم ، گفتم هم سلامی عرض کنم و اعلام موجودیتی کرده باشم ، هم اینکه بگم حد اقل 3 تا مقاله به زودی در راهه یکی راجعبه ممبر شیپ ( که قبلا کمی در مودرش گفته بودیم ! ) یکی در مورد پروفایل و یکی هم !!! این یکی جالب تره ولی به وقتش ! سربزنید ، مقاله ها بالاخره از توی تنور در میاد ! شاد باشید

یکشنبه، مرداد ۲۲، ۱۳۸۵

باز نویسی آدرس صفحات در asp.net

ویرایش : برای دریافت dll و توضیحات بیشتر به سایت http://urlrewriter.net/ مراجعه فرمایید.

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

http://www.Domain.com/default.aspx?queryString1=AAA&queryString1=BBB

و این AAA و BBB نماینده مقادیری است که با عوض شدن آنها محتوی صفحه عوض میشود . اما اگر ندانید تعجب میکنید وقتی به شما بگویم میتوانید آدرس همین صفحه را به صورت زیر داشته باشید :

http://www.Domain.com/AAA/BBB.aspx

به این کار URL rewriting میگویند که ما آن را به فارسی باز نویسی آدرس صفحات ترجمه کرده ایم . اگر بخواهید به طور متمرکز روی این مبحث کارکنید مطالب بسیار زیادی را باید در این رابطه بدانید که در حوصله این مقاله نمیگنجد . اسکات میچل (Scott Mitchell) در 4GuysFromRolla.com مقاله کاملی دارد که نسخه ای از آن نیز در MSDN آمده است است و در آن کاملا توضیح میدهد که این عمل چگونه صورت میگیرد و بعد از آن چه اتفاتی در سرور می افتد و ... ولی من سعی دارم به شما مختصر و مفید توضیح دهم که چگونه با ریفرنس کردن 2 dll که توسط آقای میچل عرضه شده است میتوانید آدرس صفحات خود را بازنویسی کنید .

قبل از آن توضیح این نکته بد نیست که در asp.net 2 این امکان به صورت پیش ساخته آماده شده است که البته شامل محدودیت است و نمیتوانید آدرس دهی پویا را توسط آن -اینطور که در این مقاله انجام میدهیم - انجام دهید.

ابتدا و برای شروع dll ها را از اینجا دانلود کنید . سپس آنها را به عنوان مرجع جدید رد پروژه خود reference کنید (از solution bar روی قسمت references رایت کلیک کنید و add reference را انتخاب کنید و...)

با این کار شما تقریبا تمام کار را انجام داده اید ! میماند اینکه تعریف کنید چه آدرس هایی را به چه آدرس هایی باید تبدیل کرد . فرض کنید کاربر در مرورگر خود آدرس http://www.Domain.com/AAA/BBB.aspx را وارد میکند ، در صورتی که چنین صفحه ای روی سرور شما وجود خارجی ندارد و برنامه شما باید متوجه شود که نمایش صفحه ای با آدرس زیر مد نظر است .

http://www.Domain.com/default.aspx?queryString1=AAA&queryString1=BBB

برای این کار کافی است از رگولار اکسپرشن (Regular Expression ) استفاده کنیم .نگران نباید حتی اگر از Regular Expression سر در نمی‌آورید در این مقاله به آن اندازه که احتمالا برای این کار نیاز دارید را در ادامه خواهید دید. اگر خواستید کد های زیر را کپی پیست کنید و در وب گانفیگ خود اسنفاده کنید حتما متون فارسی که با رنگ سبز نوشته شده است را حذف کنید . در غیر این صورت به ایراد بر خواهید خورد.

<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" /> </configSections> <RewriterConfig> <Rules> <!-- Rules for Blog Content Displayer -->

در قسمت زیر به دنبال صفحه ای به صورت G123456.aspx میگردد ، 123456 حتما باید یک عدد 6 رقمی باشد که همانطور که مشاهده میکنید در کوئری استرینگ به bID نسبت داده شده است .

<RewriterRule> <LookFor>~/G(\d{6}).aspx</LookFor> <SendTo><![CDATA[~/default.aspx?PageID=554&bID=$1]]></SendTo> </RewriterRule>

در قسمت زیر به دنبال صفحه ای به صورت G123456P123456.aspx میگردد ، 123456 حتما باید یک عدد 6 رقمی باشد که همانطور که مشاهده میکنید در کوئری استرینگ به ترتیب به bID , pID نسبت داده شده است .

<RewriterRule> <LookFor>~/G(\d{6})p(\d{6})\.aspx</LookFor> <SendTo><![CDATA[~/page.aspx?PageID=555&bID=$1&pID=$2]]></SendTo> </RewriterRule>

در قسمت زیر به دنبال صفحه ای به صورت G123456P123456.aspx میگردد ، 123456 حتما باید یک عدد 6 رقمی باشد که همانطور که مشاهده میکنید در کوئری استرینگ به ترتیب به bID , pID نسبت داده شده است .

<RewriterRule> <LookFor>~/G(\d{6})A(.*).aspx</LookFor> <SendTo><![CDATA[~/default.aspx?PageID=555&BlogID=$1&Archive=$2]]></SendTo> </RewriterRule>

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

1234/12/12.aspx <RewriterRule> <LookFor>~/(\d{4})/(\d{2})/(\d{2})\.aspx</LookFor> <SendTo>~/ShowBlogContent.aspx?year=$1&amp;month=$2&day=$3</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/(\d{4})/Default\.aspx</LookFor> <SendTo>~/ShowBlogContent.aspx?year=$1</SendTo> </RewriterRule>

چندین مثل بسیار ساده تر نیز آورده شد است

<RewriterRule> <LookFor>~/Products/Default\.aspx</LookFor> <SendTo>~/ListCategories.aspx</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/Beverages\.aspx</LookFor> <SendTo>~/default.aspx?CategoryID=1</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/Condiments\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=2</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/Confections\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=3</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/Dairy\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=4</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/GrainsCereals\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=5</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/MeatPoultry\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=6</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/Produce\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=7</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/Seafood\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=8</SendTo> </RewriterRule> </Rules> </RewriterConfig> <system.web>

...از اینجا به بعد web.config مانند قبل ادامه پیدا میکند

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

<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>

و سپس استفاده از :

<skm:Form id="Form1" method="post" runat="server">

بجای <form runat="server> که همیشه استفاده میشود است .

در این مقاله آموختیم که چگونه با اضافه کردن چند خط در web.config و همینطور ریفرنس کردن 2 dll میتوانیم در asp.net آدرس ها را بازنویسی کنیم .

جمعه، تیر ۳۰، ۱۳۸۵

چطور یک یوزر کنترل را به صورت پویا به صفحه اصلی اضافه کنیم

چطور یک یوزر کنترل را به صورت پویا به صفحه اصلی اضافه کنیم .

در این مقالاله سعی دارم توضیح دهم که چطور میتوانیم یک یوزر کنترل را به صورت پویا به وب فرم اضافه کنیم . زیاد توضیح واضحات نمیدهم :

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

در مثال ما از یک td که به صورت runat=server است استفاده کرده ایم ، شما میتوایند از هرچیزی مثلا placeholder استفاده کنید :

<table cellpadding="0" align="center" cellspacing="0">

<tr>

<td runat="server" id="MainTD">

</td>

</tr>

</table>

برای اینکه ببنید runat=server کجا استفاده شده آن را قرمز کردم ، متوجه id این td هم باشد id="MainTD" که لازم است آن را در کد بیهایند بالا PageLoad تعریف کنید به این صورت :

protected System.Web.UI.HtmlControls.HtmlTableCell MainTD;

خوب حالا میماند اضافه کردن کنترل به صفحه :

string pageStr ;

pageStr = Request.QueryString["PageID"];

Control ctrl;

ctrl = LoadControl(pageStr + ".ascx");

MainTD.Controls.Add(ctrl);

ساده بود نه ؟؟ مثلا میخواهید کنترلی با نام Test.ascx را لود کنید کافی است کوئری استرینگ شما چیزی باشد شبیه به این

.../page.aspx?PageID=text

گاهی داده اید سایتهایی را که صفحاتشان با عوض شدن کوئری استرینگ عوض میشود ؟؟ در این سایتها چنین تکنیکی روی صفحه default پیاده شده و هر یوزر کنترل نماینده یک صفحه از سایت است ! به همین سادگی !

از دات نت به رنگ آبی لذت ببرید !

پنجشنبه، خرداد ۱۸، ۱۳۸۵

استفاده از Inner Join در Query های MS SQL Sever

استفاده از Inner Join

در این مقاله سعی میکنیم مروری داشته باشیم بر یکی از اجزای سازنده Query در MS SQL Server به نام Inner Join که خود از خانواده Join ها می‌باشد . مثالی که در این مقاله دنبال می‌شود علاوه بر جنبه آموزشی ، پیشنیاز مقاله ای در باره استفاده از نقش ها در شناسایی کاربران است . فرض کنیم سه table مقابل در یک بانک اطلاعاتی موجود باشد :

UserInfo : که حاوی اطلاعات کابری و دارای دو ستون به نامهای ID و Username می باشد (ستون های اطلاعاتی دیگری نیز در این table وجود دارند ، اما در این مبحث استفاده نمیشوند ) Groups : شامل دو ستون GroupID و RoleName میشود ، نام مربوط به هر نقش (Role ) در سایت در این table به یک GroupID منتصب گشته است (مثال ) Roles : دارای دو ستون UserID و GroupID است که تمامی نقش های نصبت داده شده به هر کاربر در آن ثبت شده است

UserInfo

ID Username
100 Admin
101 Iran1360
102 Hossein
103 Mahdi_V

Groups

GroupID RoleName
1 Administrator
2 CanInsert
3 CanEdit
4 CanDelete

Roles

UserID GroupId
100 1
100 2
100 3
100 4
101 2
101 3
102 2
103 2

همانطور که در جدول Roles می‌بینید هر کاربر می‌تواند یک یا تمامی نقش ها را داشته باشد مثلا کاربری با نام کاربری "Admin" که مقدار ID برابر 100 است در جدول Roles نقشهایی باتمامی GroupId های موجود را دارا میباشد (1و2و3و4) و به عبارت دبگر ابن کاربر نقشهای "AdministratorوCanInsertوCanEditوCanDelete " را دارا می‌باشد و این در حالی است که کاربر دیگری مانند Hossein فقط نقش CanInsert را دارا است .

در اینجا می می‌خواهیم stored procedure ای بسازیم که با داشتن نام کاربری ، تمامی نقش های منتصب به کاربر را به ما برگرداند . ما می‌توانستیم همین کار را با خواندن هر سه جدول از بانک اطلاعاتی و پردازش آن توسط asp.net انجام دهیم ، اما این کار منابع زیادی را در مقایسه با روش استفاده از stored procedure مصرف میکند . به علاوه اینکه این روش آسانتر نیز هست !

برای این مقصود از Inner Join استفاده می‌کنیم .Inner Join ، پیوستن‌‌ای است که در آن مقادیری از ستونها به هم می پیوندند که توسط عملگرهای منطقی با هم مقایسه شده باشند . در استاندارد SQL-92 ، میتوانیم برای Inner Join ها از عبارات From و where استفاده کنیم که در این ستاندارد تنهای Join ای که قابلیت استفاده از عبارت where را دارد Inner Join است .

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

Code :

CREATE PROCEDURE rolesForUser ( @Username varchar(50) ) AS SELECT G.RoleName FROM Roles R INNER JOIN Groups G ON R.GroupID = G.GroupID INNER JOIN Users U ON R.UserID = U.UserID AND U.Username = @Username

توضیح : خط اول stored procedure ای با نام rolesForUser می‌سازد ، نام کاربری از برنامه دریافت شده و در Username@ ذخیره می‌گردد در ادامه نقش‌هایی انتخاب میشوند که به ID کاربر مورد نظر منتصب اند R.UserID = U.UserID AND U.Username = @Username و فقط نام نقش‌هایی انتخاب میشوند که به این کاربر منتصب اند R.GroupID = G.GroupID .

برای درک بهتر شما از موضوع مثالی از MSDN 2005 را با هم مرور میکنم :

در مثال زیر عملگر کوچکتر مورد استفاده قرار گرفته است :

Code:

USE AdventureWorks; GO SELECT DISTINCT p.ProductID, p.Name, p.ListPrice, sd.UnitPrice AS 'Selling Price' FROM Sales.SalesOrderDetail AS sd JOIN Production.Product AS p ON sd.ProductID = p.ProductID AND sd.UnitPrice < p.ListPrice WHERE p.ProductID = 718; GO

که نتیجه آن به صورت زیر خواهد بود :

ProductID Name ListPrice Selling Price ----------- --------------------------- ------------------ ------------- 718 HL Road Frame - Red, 44 1431.5000 758.0759 718 HL Road Frame - Red, 44 1431.5000 780.8182 718 HL Road Frame - Red, 44 1431.5000 858.90

شما همینطور میتوانید از عملگر نامساوی <> نیز بدین منظور بهره ببرید .