دوشنبه، دی ۱۸، ۱۳۸۵
یکشنبه، آذر ۱۲، ۱۳۸۵
نگاهی دقیق به سرویس شناسایی کاربر در دات نت 2 قسمت نخست
- Admin ,PowerUser, NormalUser
- CanEdit,CanDelete,….
- FailureText
- PasswordLabelText
- RememberMeText
- TitleText UserNameLabelText
- PasswordRequiredErrorMessage
- UserNameRequiredErrorMessage
- چطور نام ، نام خانوادگی ، تاریخ تولد و ... را هنگام ثبت نام از کاربر دریافت کنیم
- چطور به کاربر رول بدهیم
- چطور با برنامه نویسی اطلاعات کاربر ازجمله نام کاربری را بگیریم
- اطلاعات کاربر را چطور در دیتابیس خودمان ذخیره کنیم .
- و...
یکشنبه، آذر ۰۵، ۱۳۸۵
ثبت نام اینترنتی کارشناسی ارشد
یکشنبه، آبان ۲۸، ۱۳۸۵
سفری به VB.net
یکشنبه، مرداد ۲۲، ۱۳۸۵
باز نویسی آدرس صفحات در 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&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 |
||||||||||
|
Groups |
||||||||||
|
Roles |
||||||||||||||||||
|
همانطور که در جدول 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 |
شما همینطور میتوانید از عملگر نامساوی <> نیز بدین منظور بهره ببرید .