سلام دوستان عزیز ،امیدوارم که حالتون خوب باشه . امروز میخوام در مورد Asp اموزشی داشته باشیم.

مسیریابی ASP.Net شما را قادر می سازد تا از URL هایی استفاده کنید که لازم نیست در یک فایل خاص در وب سایت طرح ریزی شوند. از آنجایی URL لازم نیست روی یک فایل طراحی شود، می توانید از URL ها در یک برنامه ی وب استفاده کنید که توصیف کننده ی فعالیت یوزر می باشد، بنابراین توسط یوزرها خیلی قابل درک خواهد بود. در یک برنامه ی ASP.NET که از مسیریابی استفاده نمی کند، یک درخواست ورودی برای یک URL یک فایل فیزیکی مانند فایل .aspx روی دیسک طراحی می کند. به عنوان مثال درخواست برای http://server/application/Products.aspx?id=4 روی فایلی به نام Products.aspx طراحی می شود که حاوی کد و مارک آپ برای ارائه ی یک پاسخ به مرورگر می باشد. رشته ی ردیف از مقدار id=4 استفاده می کند تا مشخص کند چه نوع محتوایی نمایش داده شود، اما احتمالا مقدار مشخص شده برای یوزر بار معنایی کمی دارد.

در مسیریابی ASP.NET الگوهای مسیریابی را تعیین می کنید که حاوی placeholder برای مقادیری می باشند که زمانی استفاده می شوند که شما به تقاضاهای URL رسیدگی می کنید. در زمان اجرا قطعات URL که نام برنامه را دنبال می کنند، به مقادیر مجزا تجزیه می شوند، این تجزیه براساس الگوی URL می باشد که تعریف کرده اید. به عنوان مثال در تقاضا برای http://server/application/Products/show/beverages تجزیه کننده ی مسیریابی می تواند مقادیر Products, show, و beverages را برای درخواست به گرداننده انتقال دهد. بالعکس در تقاضایی که توسط مسیریابی URL مدیریت نمی شود، قطعه /Products/show/beverages به عنوان مسیر یک فایل در برنامه در نظر گرفته می شود.

برای ایجاد URLهای برنامه ریزی شده که با مسیرها تطابق دارند، می توانید از URLهای برنامه ریزی شده نیز استفاده کنید. این امر شما را قادر می سازد تا همبستگی منطقی برای ایجاد هایپرلینک ها در برنامه ی ASP.NET خود را مرکزی کنید.

مسیریابی ASP.NET در مقابل بازنویسی URL:

مسیریابی ASP.NET از دیگر برنامه های بازنویسی URL متفاوت می باشد. بازنویسی URL تقاضاهای ورودی را به وسیله ی تغییر URL قبل از ارسال تقاضا به صفحه ی وب پردازش می کند. به عنوان مثال برنامه ای که از بازنویسی URL استفاده می کند، ممکن است URL را از /Products/Widgets/ به /Products.aspx?id=4 تغییر دهد. همچنین بازنویسی URL به طور نمادین برای ایجاد URLهایی که براساس الگوهای شما می باشند، API ندارد. در بازنویسی یک URL اگر الگوی یک URL را تغییر دهید باید به طور دستی همه ی هایپرلینک هایی را که حاوی URL اصلی می باشند، آپدیت کنید. در مسیریابی ASP.NET وقتی که یک تقاضای ورودی بررسی می شود، URL تغییر نمی کند زیرا مسیریابی می تواند مقادیر را از URL استخراج کند. زمانی که شما باید یک URL ایجاد کنید، مقادیر پارامتر را به روشی انتقال می دهید که URL را برای شما تولید می کند. برای تغییر الگوی URL، آن را در یک موقعیت تغییر می دهید و تمام لینک هایی را که در برنامه ایجاد کرده اید و براساس آن الگو می باشند، به طور خودکار از الگوی جدید استفاده خواهند کرد.

تعریف مسیرهای URL:

الگوهای URL که تعریف می کنید به عنوان routes. شناخته می شوند. در یک مسیر placeholder هایی را مشخص می کنید که برای مقادیری طراحی شده اند که از درخواست URL تجزیه می شوند. همچنین می توانید مقادیر ثابتی را مشخص کنید که برای هماهنگ کردن درخواست های URL استفاده می شوند.

در یک مسیر placeholder ها را (که با عنوان پارامترهای URL اشاره می شوند) با قرار دادن آنها در یک آکولاد ( { and } )، تعریف می کنید. وقتی URL تجزیه می شود، کاراکتر / به عنوان حائل در نظر گرفته می شود. اطلاعات مربوط به مسیری که حتئل نمی باشد و در آکولاد قرار نمی گیرد، به عنوان یک مقدار ثابت در نظر گرفته می شوند. مقادیری که از بین حائل ها استخراج می شوند به placeholder ها اختصاص داده می شوند.

شما می توانید بیشتر از یک placeholder در بین حائل ها تعریف کنید، اما باید به وسیله ی یک مقدار ثابت جدا شده باشند. به عنوان مثال {language}-{country}/{action} الگوی معتبری از مسیر می باشد. به هرحال {language}-{country}/{action} یک الگوی معتبر نیست، زیرا هیچگونه حائل و یا ثابتی بین placeholderها وجود ندارد. بنابراین مسیریابی نمی تواند تعیین کند که کجا مقدار دارنده ی placeholder به زبان را از مقدار placeholder مربوط به کشور جدا کنیم.

جدول زیر الگوهای معتبر مسیر و مثال هایی از درخواست های URL را نشان می دهد که با الگو هماهنگ می باشند.

Route definition

Example of matching URL

{controller}/{action}/{id}

/Products/show/beverages

{table}/Details.aspx

/Products/Details.aspx

blog/{action}/{entry}

/blog/show/123

{reporttype}/{year}/{month}/{day}

/sales/2008/1/5

{locale}/{action}

/en-US/show

{language}-{country}/{action}

/en-US/show

معمولا شما مسیرهایی را به یک روش اضافه می کنید که از گرداننده ی رویداد Application_Start در فایل Global.asax فراخوانده شده است. این دیدگاه اطمینان می دهد که وقتی برنامه شروع شود، مسیرها در دسترس می باشند. وقتی که برنامه را تست می کنید نیز شما را قادر می کند تا روش را مستقیما فرا بخوانید. زمانی که واحد برنامه را امتحان می کنید، اگر بخواهید روشی را مستقیما فرا بخوانید، مسیری که مسیرها را ثبت می کند باید استاتیک باشد و دارای یک پارامتر RouteCollection باشد.

شما مسیرها را با اضافه کردن آنها به ویژگی استاتیک Routes از گروه RouteTable اضافه می کنید. ویژگی Routes یک آبجکت RouteCollection می باشد که همه ی مسیرها را برای برنامه ی ASP.NET ذخیره می کند. مثال زیر کدی از فایل Global.asax را نشان می دهد که یک آبجکت Route اضافه می کند که این آبجکت دو پارامتر URL به نام های action و categoryName را تعریف می کند. در مثال CategoryRouteHandler یک مسیر خاص برای گرداننده می باشد.

protected void Application_Start(object sender, EventArgs e)

{

RegisterRoutes(RouteTable.Routes);

}

public static void RegisterRoutes(RouteCollection routes)

{

routes.Add(new Route

(

“Category/{action}/{categoryName}”

, new CategoryRouteHandler()

));

}

تنظیم مقادیر پیش فرض برای پارامترهای مسیر:

وقتی که مسری را تعریف می کنید، می توانید یک مقدار پیش فرض برای یک پارامتر اختصاص دهید. اگر پارامتری در URL مقدار نداشته باشد، مقدار پیش فرض مورد استفاده قرار می گیرد. با اختصاص دادن یک دیکشنری به ویژگی Defaults از گروه Route، مقادیر پیش فرض برای یک مسیر تنظیم می کنید. مثال زیر مسیری را با مقادیر پیش فرض نشان می دهد.

void Application_Start(object sender, EventArgs e)

{

RegisterRoutes(RouteTable.Routes);

}

public static void RegisterRoutes(RouteCollection routes)

{

routes.Add(new Route

(

“Category/{action}/{categoryName}”

new CategoryRouteHandler()

)

{

Defaults = new RouteValueDictionary

{{“categoryName”, “food”}, {“action”, “show”}}

}

)

}

وقتی مسیریابی ASP.NET به یک درخواست URL رسیدگی می کند، تعریف مسیر نشان داده شده در مثال (با مقادیر پیش فرض food برای categoryNameو show برای action) نتایجی را تولید می کند که در جدول زیر ارائه شده اند.

URL

Parameter values

/Category

action = “show” (default value)

categoryName = “food” (default value)

/Category/add

action = “add”

categoryName = “food” (default value)

/Category/add/beverages

action = “add”

categoryName= “beverages”

گاهی اوقات باید به درخواست های URL رسیدگی کنید که حاوی بخش های مختلفی از URL می باشند. وقتی مسیری را تعریف می کنید، می توانید تعیین کنید که آخرین پارامتر، پارامتر را با یک (*) مشخص کنید، باید با بقیه ی URL هماهنگ باشد. که به این پارامتر با عنوان پارامتر catch-all اشاره می شود. یک مسیر با یک پارامتر catch-all با URL هایی که هیچ مقداری برای آخرین پارامتر ندارند، نیز هماهنگ می باشد. مثال زیر الگوی مسیری را نشان می دهد که تعداد نامشخصی از بخش ها را با هم هماهنگ می کند.

query/{queryname}/{*queryvalues}

وقتی که مسیریابی ASP.NET به یک درخواست URL رسیدگی می کند، تعریف مسیر نشان داده شده در مسیر، نتایجی را تولید می کند که در جدول زیر ارائه شده اند:

URL

Parameter values

/query/select/bikes/onsale

queryname = “select”

queryvalues = “bikes/onsale”

/query/select/bikes

queryname = “select”

queryvalues = “bikes”

/query/select

queryname = “select”

queryvalues = Empty string

افزودن محدودیت به مسیرها:

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

محدودیت ها با استفاده از عبارت های معمول یا با استفاده از آبجکت های اجرا کننده ی اینترفیس IRouteConstraint تعریف می شوند. وقتی که شما تعریف مسیر را به مجموعه ی Routes اضافه می کنید، با ایجاد آبجکت RouteValueDictionary محدودیت هایی را اضافه کرده اید که دارای تست تایید می باشند. پس از آن این آبجکت را به ویژگی Constraints اختصاص می دهید. کلید در دیکشنری پارامتری را که محدودیت برایش در نظر گرفته شده، تشخیص می دهد. مقدار در دیکشنری می تواند یا یک رشته باشد که یک عبارت معمول را نشان می دهد، یا یک آبجکت که اینترفیس IRouteConstraint را اجرا می کند. اگر شما یک رشته ارائه بدهید، مسیریابی با رشته مانند یک عبارت معمول رفتار می کند و با فراخواندن روش IsMatch از گروه Regex چک می کند که آیا مقدار پارامتر معتبر است یا نه. یک عبارت معمول همیشه به عنوان یک مورد ناهوشمند در نظر گرفته می شود.

اگر یک آبجکت IRouteConstraint ارائه دهید، مسیریابی ASP.NET با فراخوانی روش Match از آبجکت IRouteConstraint چک می کند که آیا مقدار پارامتر معتبر می باشد یا نه. روش Match یک مقدار Boolean را گزارش می دهد که نشان می دهد آیا مقدار پارامتر معتبر است یا نه.

مثال زیر محدودیت هایی را نشان می دهد از آنچه مقادیر می توانند در پارامترهای locale و year در بر بگیرند.

void Application_Start(object sender, EventArgs e)

{

RegisterRoutes(RouteTable.Routes);

}

public static void RegisterRoutes(RouteCollection routes)

{

routes.Add(new Route

(

“{locale}/{year}”

, new ReportRouteHandler()

)

{

Constraints = new RouteValueDictionary

{{“locale”, “[a-z]{2}-[a-z]{2}”},{year, @”\d{4}”}}

});

}

وقتی مسیریابی یک درخواست URL را مورد بررسی قرار می دهد، تعریف مسیر نشان داده شده در مثال قبلی نتایجی را ایجاد می کند که در جدول زیر ارائه شده اند:

URL

Result

/en-US

No match. Both locale and year are required.

/en-US/08

No match. The constraint on year requires 4 digits.

/en-US/2008

locale = “en-US”

year = “2008”

سناریوها در زمان به کار نگرفتن مسیریابی:

به طور پیش فرض درخواست هایی که با یک فایل فیزیکی موجود روی سرور وب طراحی می شوند، رسیدگی نمی کند. برای مثال اگر یک فایل فیزیکی در Products/Beverages/Coffee.aspx وجود داشته باشد، تقاضا برای http://server/application/Products/Beverages/Coffee.aspx رسیدگی نمی شود. مسیریابی به تقاضا رسیدگی نمی کند، حتی اگر با یک الگوی تعریف شده مانند {controller}/{action}/{id} هماهنگ باشد. اگر شما می خواهید مسیریابی کنید تا به همه ی فایل رسیدگی کنید، حتی درخواست هایی که به فایل ها اشاره دارند، می توانید با تنظیم ویژگی RouteExistingFiles از آبجکت RouteCollection برروی True رفتار پیش فرض را بنویسید. وقتی آن را با true تنظیم می کنید، همه ی درخواست هایی که با الگوی تعریف شده هماهنگ هستند، توسط مسیریابی مورد رسیدگی قرار می گیرند. همچنین می توانید تعیین کنید که مسیریابی نباید به درخواست های خاصی از URL رسیدگی کند. شما با تعریف یک مسیر و مشخص کردن گروه StopRoutingHandler که باید برای رسیدگی به الگو استفاده شود، مانع رسیدگی به برخی درخواست های خاص توسط مسیریابی می شوید. وقتی که یک درخواست توسط آبجکت StopRoutingHandler رسیدگی می شود، این مسیر هرگونه پردازش اضافه ی درخواست به عنوان یک مسیر را بلوک می کند. در عوض مسیر به عنوان یک صفحه ی ASP.NET یا سرویس وب ویا دیگر موارد ASP.NET پردازش می شود. به عنوان مثال شما می توانید تعریف زیر را برای جلوگیری از مسیریابی برای فایل WebResource.axd ارائه دهید.

public static void RegisterRoutes(RouteCollection routes)

{

routes.Add(new Route(“{resource}.axd/{*pathInfo}”, new StopRoutingHandler()));

}

چگونه URL ها با مسیرها هماهنگ می شوند؟

وقتی که مسیریابی به درخواست های URL رسیدگی می کند، سعی می کند URL درخواست را با یک مسیر هماهنگ کند. هماهنگ سازی درخواست URL با یک مسیر به تمامی شرایط زیر بستگی دارد:

· الگوهای مسیر که تعریف کرده اید یا الگوهای پیش فرض مسیر، اگر هرکدام ار آنها شامل پروژه ی شما می شوند.

· ترتیبی که شما آنها را به مجموعه ی Routes اضافه کرده اید.

· هر مقدار پیش فرضی که شما برای یک مسیر ارائه کرده اید.

· هر محدودیتی که برای یک مسیر ارائه داده اید.

· اینکه شما مسیریابی را برای رسیدگی به درخواست هایی تعریف کرده اید که با یک فایل فیزیکی هماهنگ می باشد.

برای جلوگیری از داشتن رسیدگی کننده ی اشتباه برای رسیدگی به یک درخواست، در هنگام تعریف مسیرها باید تمام این شرایط را در نظر داشته باشید. برای منظم کردن آبجکت های Route که در مجموعه ی Routes ظاهر می شوند، واضح می باشد. هماهنگ سازی مسیر از اولین مسیر تا آخرین مسیر در مجموعه انجام می شود. وقتی که یک هماهنگ سازی اتفاق می افتد، مسیرهای بیشتری ارزیابی نمی شوند. به طور کلی مسیرهایی را به ویژگی Routes اضافه کنید، از واضح ترین تعریف مسیر تا نامشخص ترین آنها.

به عنوان مثال تصور کنید مسیرهایی را با الگوهای زیر وارد کرده اید:

· مسیر ۱: {controller}/{action}/{id}

· مسیر ۲: products/show/{id}

مسیر ۲ هرگز به درخواستی رسیدگی نخواهد کرد، زیرا مسیر ۱ زودتر ارزیابی شده و همیشه با درخواست هایی که می توانند با مسیر ۲ کار کنند نیز هماهنگ می شود. یک در خواست برای http://server/application/products/show/bikes به نظر می رسد با مسیر دوم خیلی بیشتر هماهنگ باشد، اما با مقادیر زیر توسط مسیر ۱ مورد رسیدگی قرار می گیرد:

controller = products
action = show

· id = bikes

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

· مسیر ۱: {report}/{year}/{month} با مقادیر پیش فرض برای ماه و سال.

· مسیر ۲: {report}/{year} با وقدار پیش فرض برای سال.

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

شما می توانید با وارد کردن ثابت هایی مانند annual/{report}/{year} و monthly/{report}/{year}/{month} ابهام را از الگوها برطرف کنید.

اگر یک URL با هرکدام از آبجکت های Route تعریف شده در مجموعه ی RouteTable هماهنگ نیست، مسیریابی ASP.NET درخواست را پردازش نمی کند. در عوض پردازش به یک صفحه ی ASP.NET، سرویس وب و یا دیگر برنامه های ASP.NET منتقل می شوند.

ایجاد URLها از طریق مسیرها:

وقتی که می خواهید ارتباط (logic) را برای ساخت URL ها مرکزی کنید، می توانید از مسیرها برای تولید URL ها استفاده کنید. شما با انتقال مقادیر پارامتر به عنوان دیکشنری به روش GetVirtualPath از آبجکت RouteCollection یک URL ایجاد می کنید. روش GetVirtualPath به دنبال اولین مسیر در آبجکت RouteCollection می باشد که با پارامترهای دیکشنری هماهنگ هستند. مسیر هماهنگ شده برای تولید URL استفاده می شود. مثال زیر یک تعریف از مسیر ارائه می دهد. در این مثال CategoryRouteHandler یک مسیر رسیدگی کننده ی سفارشی می باشد. برای اطلاعات در مورد چگونگی ایجاد یک مسیر رسیدگی کننده ی سفارشی How to: Use Routing with Web Forms را بررسی کنید.

public static void RegisterRoutes(RouteCollection routes)

{

routes.Add(new Route

(

“Category/{action}/{categoryName}”

new CategoryRouteHandler()

)

{

Defaults = new RouteValueDictionary {{“categoryName”, “food”},

{“action”, “show”}}

}

);

}

The following example shows a control that creates a URL based on the route.

VB

Dim urlParameters As RouteValueDictionary

urlParameters = New RouteValueDictionary(New With {.categoryName = “beverages”, _

.action = “summarize”})

HyperLink1.NavigateUrl = RouteTable.Routes.GetVirtualPath _

(context, urlParameters).VirtualPath

C#

HyperLink1.NavigateUrl = RouteTable.Routes.GetVirtualPath

(context,

new RouteValueDictionary {

{ “categoryName”, “beverages” },

{“action”, “summarize” }}

).VirtualPath;

وقتی این کد اجرا می شود، کنترل HyperLink1 حاوی مقدار”Category/summarize/beverages” در ویژگی NavigateUrl می باشد.

وقتی شما یک URL از یک مسیر ایجاد می کنید، می توانید مشخص کنید که از کدام مسیر برای وارد کردن نام برای مسیر استفاده کنید. برای اطلاعات بیشتر How to: Construct a URL from a Route را مشاهده کنید.

همچنین موارد زیر را نیز مشاهده کنید:

کارها:

How to: Use Routing with Web Forms

مفاهیم:

Understanding the ASP.NET Infrastructure

تغییر تاریخ:

Date

History

Reason

October 2009

ترکیب ثابت در کد مثال

Customer feedback.