در دو نوشته پیشین درباره مسیرها و دو گونه مسیر Conversion و مسیر Attribute آموزش داده ایم و در این نوشته می خواهم مفهوم تازه ای به نام محدودیت های مسیریابی (Routing Container) را بگویم. همانگونه که از نام آن بر می آید، این ویژگی محدودیتی را بر درخواست های ورودی می سازد که از راه نشانی های URL به برنامه ASP.NET Core MVC فرستاده می شوند. محدودیت ها می توانند بر گونه داده (Data Type)، اندازه و بازه (Length and Range) و یا به گونه عبارت های باقاعده (Regular Expression) باشند.

محدودیت ها بر روی گونه داده ها

همانگونه که گفتم الگوی مسیرها به گونه [Controller/Action/[Parameters است که شاید یک متد کنترل گر ورودی نداشته باشد، پس Parameters اختیاری است. ورودی های یک متد می توانند از گونه هایی مانند int, string یا float باشند. فرض کنید می خواهیم داده های یک کارمند ویژه از پایگاه داده را نشان دهیم. کلید اصلی در جدول EmployeeId که جستجو بر پایه آن انجام می شود، زیرا کلید اصلی درون جدول یکتا و یک اندیس (Index) است. 

به گفته دیگر می خواهیم ورودی متد که از راه نشانی URL انجام می شود به گونه int محدود شود. در این نمونه ورودی از راه نشانی و به گونه https://127.0.0.1:5001:employee/show/empId که empId حتما باید int باشد. در کد زیر یک متد به نام ShowById نوشته ایم که یک ورودی int دریافت می کند، پس در پایان نشانی و پس از نام متد کنترل گر، یک ورودی خواهیم داشت. بنابر آنچه که گفتیم، پس نشانی https://127.0.0.1:5001:employee/showbyid/100 درست است ولی https://127.0.0.1:5001:employee/showbyid/amir نادرست است.

در کد بالا برای سادگی خروجی متد string است که رشته برگشتی، همان شماره شناسه کارمندی است که از وردی دریافت کرده ایم. چون ورودی int است، پس به کمک متد ()ToString مقدار empId را از int به string تبدیل کرده ایم و سپس به کمک دستور پیش روی عبارت return برآیند تابع به کاربر نشان داده می شود. همچنین در کد بالا از مسیرهای Attribute کمک گرفته ایم که در آن employee نام کنترل گر و showbyid نیز نام متد است.

در کد زیر متد دیگری به نام ()GetInfo نوشته ایم که سه ورودی رشته، شماره صحیح و روز و زمان را دریافت می کند. در بالای برنامه یک مسیر Attribute نوشته که تنها برای دو پارامتر age و birthday را آشکارا گونه را نوشته ایم. بنابراین age باید int و birthday باید DateTime باشد. بنابراین در رشته و پس از نام متد به دنبال هم سه پارامتر می خواهیم که هر یک باید از دیگری با کاراکتر / از هم جدا شوند. بنابراین اگر مسیری باید ورودی های متد را دریافت کند، ترتیب این ورودی ها از چپ به راست در تعریف پارامترهای متد است که در نشانی URL با / از هم جدا می شوند. بنابراین نشانی https://localhost:5001/employee/getinfo/amir/36/1983-06-07 درست است که در پایان تاریخ تولد 07-06-1983 آورده شده است.

در زیر فهرستی از همه محدودیت ها بر روی گونه داده نشان داده شده است. در میان آنها (یکی مانده به پایان) guid که کوتاه شده Globally Unique IDentifier، یک گونه در سی شارپ است که یک شناسه (Identifier) شماره ای یکتا (Unique) و سراسری (Global) را می سازد. GUID یک شناسه ۱۲۸ بیتی (۱۶ بایتی) است که می تواند در سرتاسر رایانه یا شبکه به کارگرفته شود.

  • {entryId:int}
  • {isVisible:bool}
  • {entryDate:datetime}
  • {weight:double}
  • {weight:float}
  • {price:decimal}
  • {id:guid}
  • {postId:long}

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

یکی دیگر از محدودیت هایی که می توان بر روی الگوی مسیر و از این رو، بر روی داده های ورودی از نشانی URL گذاشت، اندازه و محدوده داده است. بنابراین می توانیم اندازه یک رشته (طول رشته) و یا محدوده (Range) یک شماره مانند شماره ای میان ۸ تا ۷۰ سال را برای ورودی مشخص کنیم. در بخش بالا گفتیم که empId که ورودی متد ()ShowById است، برابر با یک شناسه (کلید اصلی) درون جدول است، پس نمی تواند کمتر از یک شماره مشخص مانند ۱ باشد، زیرا به گونه پیش فرض Auto Increment، کلید اصلی با مقدار ۱ آغاز شده و یکی یکی افزوده می شود.

در کد بالا تابع ()min را به کار برده ایم تا مقدار یا اندازه کمینه برای شماره شناسه کارمندی را مشخص کنیم. در کد زیر یک محدوده شماره میان ۸ تا ۷۰ سال را برای سن در ورودی از راه نشانی، مشخص کرده ایم. این بازه در میان پرانتزهای باز و بسته و به شیوه (70, 8) مشخص شده است. همچنین تابع دیگری به نام maxLength را برای name به کار برده ایم تا نشان دهیم که اندازه رشته نام نمی تواند بیشتر از ۲۵ کاراکتر باشد.

بنابراین تابع های ()min و ()max اندازه کمینه یا بیشینه را برای شماره و از بازه مشخص شده با (start, end) محدوده شماره ها را برای یک ورودی شمار ای مشخص می کنیم و می توانیم دو تابع ()minLength و ()maxLengt نیز برای کمترین و بیشترین اندازه کاراکترهای یک رشته به کار می روند. تابع دیگر ()length است که اندازه ثابتی را برای کاراکترهای رشته تعیین می کند.

محدودیت با عبارت های باقاعده

اگر که نیاز داشته باشیم تا کنترل بیشتری روی داده های ورودی از نشانی های URL داشته باشیم، می توانیم عبارت های باقاعده را به کار ببریم. زمانی عبارت های باقاعده (منظم) را به کار می بریم که نیاز داشته باشیم تا ورودی را با یک الگو از پیش آماده شده درون الگوی مسیر تطابق دهیم. در نشانی URL می خواهیم رشته هایی به الگوی blog/153-testing-the-system/ داشته باشیم، به گونه ای که پس از /blog/ یک رشته باشید که با شماره آغاز شده (۱۵۳) و سپس پس از شماره یک کاراکتر – باشد و به دنبال آن یک سری دیگر از رشته های که می توانند دارای شماره و حرف باشند بیایند (testing-the-system). الگویی که برای این خواهیم داشت به گونه زیر است.

الگوی بالا با ^ آغاز شد که نشان دهنده سپس به دنبال آن {7, 1} [9, 0] آمده و همگی به دنبال هم بدین معنی هستند که آغاز رشته باید تنها با شماره صفر تا نه آغاز شود که اندزه این رشته می تواند یک تا هفت کاراکتر باشد. سپس در الگو -\ آمده که تطابق برای کاراکاتر – را نشان می دهد، پس تا بدین جا تطابق -153 در رشته نمونه انجام شد. سپس می تواند هر رشته ای از حرف های کوچک و شماره های صفر تا نه بیاید که این تظابق را [-\a-z0-9] را نشان می دهد. توجه کنید بازهم درون بلوک پایانش -\ است که بدین معنی است رشته اصلی با – به زیر رشته هایی مانند testing-the-system شکسته می شود. سپس به دنبال آن {50, 3} را داریم که رشته پس از -153 می توانند از سه تا پنجاه کاراکتر باشد. در پایان $ آمده است که نشان دهنده پایان است.به گفته عبارت دیگر ^ نشان می دهد آغاز الگو چگونه است و $ نشان می دهد پایان الگو چگونه است. در کد زیر تنها الگوی مسیر Attribute آورده شده است. همانگونه که می بینید آغاز رشته مسیر با @ است و برای تعیین عبارت باقاعده تابع ()regex را به کار برده ایم.