آرمان
آرمان
خواندن ۳ دقیقه·۶ سال پیش

(متدهای مدیریت کننده)Handler Methods در Razor Pages

می توانیم کد و مدل در یک فایل .cshtml یا درون فایل code behind که مختص فایل cshtml قرار بدهیم - پسوند فایل code behind این cshtml.cs است.

متدهای Handler یا Razor page Handlers راهی برای اتصال درخواست های کاربر به متد های ما هستند. درخواست ها از فایل cshtml آمده است.

(هندلر-Handler یعنی مدیریت کننده یا اداره کننده - همینطوری گفتم یک وقتی اگر سوال پیش اومد معنیش چی هست)




نام گذاری Razor page ها از قرارداد خاصی پیروی میکنند.خود asp.net core برای ما چندتا از این handler متد ها را برای ما تولید میکند که عبارت اند از:

  • OnGet
  • OnPost
  • OnGetAsync
  • OnPostAsync
  • OnPostRemoveLoginAsync
  • OnGetLinkLoginCallbackAsync
  • ....

با مشاهده لیست بالا ما میتوانیم به الگوی خاص نامگذاری پی ببریم. همه آنها با On شروع میشوند بعد از آن نوع فعل http مثلا Get یا Post و بعد از آن نام اختیاری Handler و در نهایت هم اگر متد ما async باشد باید کلمه Async به انتهای نام آن اضافه شود.

نمونه GitHub اینجاست.

GET و POST Handlers پیشفرض

هنگام باز شدن یک Page به صورت پیشفرض Get یا GetAsync Handler درون Code behind ما صدا زده میشود. همین اتفاق برای form پیشفرض که submit فشرده میشود برای Post یا PostAsync اتفاق می افتد:

مپ میشود به :

(مپ شدن یک اصطلاح هست معنیش میشه وصل شدن ، تطبیق پیدا کردن ، روی هم قرار دادن)

هردو OnPostAsync یا OnPost به خوبی کار میکنند. اگر می خواهید با OnPost کار کنید code شما نباید async باشد.

اگر بخواهید همزمان از متد های OnPostAsync یا OnPost Handler استفاده کنید، به این مشکل بر میخورید:

خطای استفاده همزمان از OnPost و OnPostAsync
خطای استفاده همزمان از OnPost و OnPostAsync

نام های سفارشی Handler

علاوه بر نام های پیشفرض Handler، ما میتوانیم نام های سفارشی ایجاد کنیم.

فرض کنید در cshtml کدزیررا داریم:

asp-page-handler=
asp-page-handler=

کد Html بالا یک فیلد Description ساده به ما میدهد:

در Razor Pages برای Match کردن (همخوانی داشتن) فرم ما با متد Handler در فایل code behind - cshtml.cs باید نام آن را به درستی انتخاب کنیم: OnPostFirst یا OnPostFirstAsync ، بسته به نوع کدی که می خواهیم درون این اجرا کنیم.ما می خواهیم از طریق متد های async فریمورک انتیتی (EntityFramework) دسته بندی ها (category ها) را داخل دیتابیس insert و ذخره کنیم:

به اسمش دقت کنید OnPostFirstAsync

چندین POST Handler در یک Page

اجازه دهید آخرین کد cshtml با اضافه کردن یک فرم Post دیگر گسترش دهیم.

در cshtml داریم:

سپس دو فرم به دو متد ما در کد match میشود:

نکته کلیدی این است که handler درون فرم با کمک Tag Helper (تگ هلپر) asp-page-handler مشخص میشود.

از این رو،میتوانیم با یک فرم به یک چیز دسترسی داشته باشیم، و دو submit input درون فرم داشته باشیم (یک فرم با چند POST):

پارامتر های متد Handler

برای ورودی (input) یک فرم به عنوان پارامتر یک Handler (متد)، نام ها باید هماهنگ(sync) باشند.

نام ورودی HTML باید با نام پارامتر متد handler یکسان باشد (match باشند) -- همون مدل binder خودمونه! :

ارسال پارامتر ها ازطریق route ها

در اینجا دو مثال از ارسال پارامتر ها از طریق route داریم:

هدف اولی متد search handler هست .که "Core" به عنوان query parameter ارسال میکند.

هدف دومی متد delete handler و id (یک) 1 را ارسال میکند. بدین معناست که route اول را حذف میکند.

منبع

یک برنامه نویس که هرآنچه را که یاد میگیرد در دفترچه یادداشت ویرگولیش یادداشت میکرد(!) حتی یک خط ! تا درصورت نیاز به آن رجوع کند...
شاید از این پست‌ها خوشتان بیاید