در ASP.NET MVC به طور پیش فرض و توکار آدرس هایی که تولید میشه هم کاربر پسند و هم از نظر سئو دارای مزیتهای زیادی هست اما در ASP.NET Web Forms این امکان به صورت پیش فرض وجود نداره و نیاز به کمی کد نویسی داره،در این مطلب ما با کمی دستکاری در فایل global.asax پروژه این امکان رو برای وب سایت ASP.NET خودمون ایجاد میکنیم.
در ابتدای کار فایل Global.asax رو باز میکنیم و این تابع رو به انتهای فایل اضافه میکنیم،دقیقا بعد از متد Session_End اضافه اش میکنیم.
void RegisterRoutes(RouteCollection rotes) { }
خوب حتما سوال پیش میاد چرا این تابع هیچ خروجی نداره و اون پارامتر ورودی هم چیه؟ تابع رو به صورت void تعریف میکنیم چون قرار نیست خروجی داشته باشه بلکه کدهای داخل تابع کار اصلی رو انجام میدن؛اون پارامتر ورودی هم مسیرهای درخواستی به اپلیکشن رو در اختیار ما قرار میده (پروسه هدایت درخواستهای HTTP از سمت کلاینت به سمت اپلیکشن و در نهایت تابع مورد نظر برای اجرای درخواست رو بهش میگن مسیریابی یا Routing).
خوب حالا ما این تابع رو باید در متد اجرای اپلیکیشن صدا بزنیم.در همین فایل global.asax متدی با نام Application_Start وجود داره که این متد هنگامی فراخوانی میشه که اپلیکیشن ما شروع به کار میکنه و اولین درخواست براش ارسال میشه.
void Application_Start(object sender, EventArgs e) { // Code that runs on application startup RegisterRoutes(RouteTable.Routes); }
خوب ما در این تابع جدول مسیرهای اپلیکیشن رو برای تابع خودمون به عنوان پارامتر ارسال کردیم تا بتونیم داخل تابع خودمون اونارو به مسیر صحیح هدایت کنیم.
در این مرحله ما کدهای لازم رو به تابع خودمون اضافه میکنیم،فرض کنید صفحه ای با نام Products.aspx دارید که محصولات سایت رو نشون میده و برای نمایش دسته ای از محصولات شما به طور معمول از این کد استفاده میکنید.
Products.aspx?cat_id=115
و حالا میخوایم با استفاده از این کد به این شکل تغییرش بدیم.
Products/cat/115
برای این کار ما کد زیر رو به تابعی که ساختیم اضافه میکنیم.
void RegisterRoutes(RouteCollection rotes) { rotes.MapPageRoute("", "Products/cat/{id}", "~/Products.aspx"); }
در این کد گفتیم که اگه درخواستی به شکل Products/cat/id برای ما ارسال شد شما این درخواست رو به صفحه Products.aspx منتقل کن،در قسمت کد id رو داخل براکت قرار دادیم و این یعنی این مقدار متغییر هستش و میتونه هر مقداری باشه که در صفحه مورد نظر قابل دریافته.پارامتر اول متد MapPageRoute هم رو خالی قرار دادیم ولی توضیحش اینه که در اونجا باید نامی برای این route خودمون انتخاب کنیم تا در قسمتهای دیگه ازش استفاده کنیم.
حالا برای تست صفحه Products.aspx رو باز میکنیم و در داخل متد page_load کد زیر رو مینویسیم.
protected void Page_Load(object sender, EventArgs e) { string id = RouteData.Values["id"].ToString(); Response.Write(id); }
اینجا از مقادیری که با درخواست ارسال شده چک میکنیم ببینیم مقدار id ست شده که اگه ست شده باشه اونو دریافت و چاپش کردیم(عنوان id دقیقا همونی هست که درتابع اصلی ثبتش کردیم،حال شما میتونید از دیتابیس اطلاعات لازم رو دریافت کنید و نشون بدید )
اگه مراحل کار رو به دزستی انجام داده باشید میتونید از آدرس Products/cat/115 به جای Products.aspx?cat_id=115 استفاده کنید.
شما به هر تعداد که خواستین میتونید برای صفحات مختلف Routing تعریف کنید و ازشون به خوبی استفاده کنید.
امیدورام مفید بوده باشه.موفق باشید
منبع:MSDN
سلام وقت بخیر
میخواستم اگه میشه توضیح بدید چطور میتونم بین webform ها یی ک جدا ساختم داخل پروژه asp.net توسط mvc5
و ویو هایی ک برای هر موجودیت دیتابیس ساختم
چطور میتونم بین این دوتا ارتباط بدم؟
پروژه ساخت یک سامانه هست
اگه با mvc ساخته باشین به راحتی در کنترلر می تونید مشخص کنید چه فایل view نمایش داده بشه و تمام داده ها رو به اون view ارسال کنید و نمایش بدین.
اقا کیوان خب من اگه بخوام ادرس های مطالبم اینطوری بشه باید چکار کنم؟
مثلا: WebSite.com/the-first-post
ممنون
به جدول مطالب یه فیلد با عنوان slug اضافه میکنن و اون مقدار دلخواه رو براش قرار میدن (موقع ثبت مطلب جدید) حالا بر اساس اون مقدار مطلب رو لود میکنن و به کاربر نشون میدن.دقیقا با استفاده از همین روش بازنویسی آدرس ها میشه ازش استفاده کرد.MVC هم که ذاتا اینطوریه آدرس هاش.
ببخشید من اینقدر سوال میپرسما 😀
خب آقا کیوان تو بازنویسی آدرس ها(در روشی که شما گفتین) بالاخره باید تو یجایی id مطلب رو بدیم دیگه!!!!!
ولی خب من میخوام که اصلا id مطلب رو در url ندم!
همون طور که سجاد گفتن لازمه یه فیلد در آدرس موجود باشه که ما گفتیم slug یا همون نام پست باشه به همون شکلی که شما گفتین دیگه لازم نیست id هم باشه،البته اگه آیدی هم باشه مشکلی برای سئو پیش نمیاد.
خب بالاخره باید query بر اساس یه فیلدی به دیتابیس ارسال بشه، استفاده از غیر از id هم کمی غیر منطقیه، چونکه اولا باید کاملا دقیق باشه مقدار، و درضمن بیشتر از یک نتیجه رو برای نمایش مطلب بر نگردونه، میتونید از اسم مطلب هم استفاده کنید، البته اگه عنوان مطالبتون مشابه نباشه
خب اقا کیوان یه سوال دیگه!
من چطور میتونم ادرس url رو خودم تعیین کنم؟
مثلا عنوان مطالب بره و در url بشینه!
مثل این: website.com/the-first-post
خب اقا کیوان من url رو که اینجوری کنم پس چجوری باید با queryString مقدار id مطالب رو بگیرم؟!!
در این جا لازم نیست دیگه شما از کوئری استرینگ استفاده کنی بلکه از route به ترتیب میتونی پارامترهایی که در تایع registerroute تعریف کردی رو بخونی،مثلا اینجا شده id حالا میتونی یه پارامتر دیگه تعریف کنی به نام cat و در صفحه مربوطه مقدار cat رو مثل آیدی بخونی.
درست شد اقا کیوان 🙂
ممنون
اقا کیوان مطلبتون واقعا خوب و کار آمد بود!
ممنون
سلام ، عالی بود. 😀
سلام خوبه حداقل به درد شما خورد 🙂
سلام کیوان جان؛
همین تو لود اولیه سایت در صفحه اول؛ البته الان خداروشکر اوکی شد!
سلام؛
ممنون آقاکیوان عزیز؛
آقا کیوان لود سایت کند شده مشکلی پیش اومده؟
سلام میثم خان،نه داداش مشکلی نیست؛یعنی ما که چیزی ندیدیم،میشه بگی کجا همچین مشکلی وجود داره و چقدر تاخیر داره؟