داشتن Urlهای تمیز و با معنا یکی از ویژگیهای یک سایت خوب هست و بهترین روش برای بازنویسی URLها یا همان Url Routing، استفاده از امکانات توکار خود ASP.Net برای این کار است. در یک مثال کوچک برای WebFormها این کار را بررسی خواهیم کرد.
ابتدا باید فضای نام System.Web.Routing را در فایل Global.asax اضافه کنیم .
سپس توسط RouteTable.Routes.MapPageRoute در Application_Start میتوانیم الگوهای تبدیل Urlهای خود را بنویسیم.
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapPageRoute("Product", "Product/{Name}", "~/Product.aspx");
}
تابع RouteTable.Routes.MapPageRoute سه ورودی میگیرد. ورودی اول یک نام برای الگوی تبدیل ماست که در مثال بالا، "Product" نام گرفته است. ورودی دوم، الگوی تبدیل ماست که میگوید Url هایی به شکل {Product/{Name را به صفحهی Product.aspx بفرست و در صفحهی Product.aspx میتوانیم مقدار {Name} را توسط ["Page.RouteData.Values["Name بدست بیاوریم . ورودی سوم نیز صفحهی مقصد میباشد.
با این الگو میتوانیم لینک هایی مثل "لبتاب/Product" ایجاد کنیم و در صفحهای که میخواهیم اطلاعات محصولمان را نشان دهیم از ["Page.RouteData.Values["Name که همان مقدار لبتاب را بر میگرداند، استفاده کنیم.
یک مثال واقعیتر؛ مثالی که در URLهای مقالات همین سایت هم از آن استفاده شده
البته از نوع MVC .
RouteTable.Routes.MapPageRoute("PostDetail", "Post/{pi}/{pt}", "~/PostShow.aspx");
این الگو یو آر الی مثل "این-یک-تست-است/Post/2" را به صفحهی PostShow.aspx میفرستد و در صفحهی مقصد میتوانیم توسط ["Page.RouteData.Values["pi که منظور از pi همون PostId یا کد مقاله ما است، خوانده و نمایش دهیم. دلیل ارسال قسمت {pt} یا همان "این-یک-تست-است" میباشد و از pt منظورمان PostTitile یا عنوان مقالهاست که در SEO سایت تاثیر زیادی دارد.
نحوه استفاده از این تبدیل هم اینطور میتواند باشد.
ساخت لینک :
<a href='<%# string.Format("/Post/{0}/{1}",Eval("PostID"),Eval("PostTitle").ToString().Replace(" ","-")) %>'>
وقتی روی لینک کلیک میشود، به طور مثال چنین آدرسی در قسمت آدرس مرورگر ظاهر میشود. دلیل استفاده از Replace هم برای زیباتر شدن Url هست. چون فضای خالی در Url زیبا نیست.
Post/12/چگونه-طراحان-وب-به-جهنم-می-روند!؟
و در صفحهی PostShow.aspx به این نحو میتوانیم اطلاعات مقالهی مورد نظر را بدست بیاریم:
int pi = int.Parse(Page.RouteData.Values["pi"].ToString());
Posts post = (from p in con.Posts where p.PostID == pi select p).FirstOrDefault();
یا حتی برای نشان دادن اطلاعات از این روش استفاده کنیم:
<asp:EntityDataSource ID="EntityDataSource1" runat="server"
AutoGenerateWhereClause="True" ConnectionString="name=WebWorkEntities"
DefaultContainerName="WebWorkEntities" EnableFlattening="False"
EntitySetName="Posts" EntityTypeFilter="Posts" Where="" Select="">
<WhereParameters>
<asp:RouteParameter Name="PostID" RouteKey="pi" DbType="Int32"
DefaultValue="0" />
</WhereParameters>
</asp:EntityDataSource>
منطورم استفاده از asp:RouteParameter در <WhereParameters> برای انتخاب مقاله است.
و برای زیباتر شدن کد نویسی، بهتر است الگوهای تبدیل را در یک تابع جدا بنویسیم:
protected void Application_Start(object sender, EventArgs e)
{
RoutingSite(RouteTable.Routes);
}
public static void RoutingSite(RouteCollection route)
{
route.MapPageRoute("PostDetail", "Post/{pi}/{pt}", "~/PostShow.aspx");
route.MapPageRoute("RouteAbout", "About-Me", "~/About.aspx");
}
مطالعه بیشتر