رضا بزرگی
رضا بزرگی
خواندن ۲ دقیقه·۵ سال پیش

کمی در مورد Razor Page

برنامه‌نویسان دات‌نت در سمت ویو ابزاری دارند که هرچند در دیباگینگ آزاردهنده است اما مزایایی که ارائه میدهد، راضی‌کننده است، اسم آن Razor است. در واقع ریزر موتور Viewای هست با زبان تلفیقی C# و HTML تلاش میکند که صفحاتی با منطق برنامه‌نویسی تولید کنیم. وجود تگ هلپرها در ویو کار توسعه در View را جذاب‌تر هم کرده است.

اما این مطلب در خصوص این موتور پیشرفته نیست. که در خصوص صفحات ریزر هستند. صفحاتی که آمده است تا با الهام از گذشته (وب‌فرم) به ساده‌تر شدن سیکل توسعه کمک کند. الگوی MVC معمولا نباید در هر جایی استفاده شود. خیلی اوقات پیاده‌کردن منطق یک صفحه‌ی تماس با ما نیازی به پیچیدگی زیاد ندارد یک View است و یک لاجیک. این استکه ماکروسافت در کنار استفاده از MVC این امکان را فراهم کرد که بتوانیم از قسمتی از فریم‌ورک MVC به نام‌ Razor Page، بتوانیم با داشتن Viewهای ریزر و PageModelهای پشت آن توسعه را سریعتر پیش ببریم.


در ادامه نکاتی از ریزر پیج آمده است

  • برای سایتهایی که صفحات زیادی دارند گزینه ی مناسبی است اما برای وب سرویس ها یا پروژه هایی که از AJAX زیاد استفاده می کنند کارایی ندارد.
  • مایکروسافت تاکید می کند که Razor Page فقط برای طراحی سایت های کوچک نیست و می توانید برای پیاده سازی هر سایتی از آن استفاده کنید
  • جهت نمایش ولیدیشن فرم از asp-validation-for استفاده میشود و در حالیکه برای مدل‌ولیدیشن (که ترکیبی که پراپرتی‌ها هست) از asp-validation-summary استافده میشود.
  • با استفاده از تگ‌هلپر asp-page-handler میتوانیم کنترلر کنیم که کدام متد پست شدن یک فرم را مدیریت میکند. در کد بی‌هایند بایستی اسمی که بعنوان هندلر وارد شده است پس از OnPost وارد شود.
  • در نسخه Razor Pages امکان استفاده از ViewBag وجود ندارد و این امکان قرار نیست به آن اضافه شود. به طور کلی توصیه میشود همیشه از ViewData استفاده کنید چون ViewBag متغیر دینامیک است و پردازش آن زمان بیشتری میگیرد.
  • ما می توانیم قالبی را در مسیرهای دوستانه تعریف کنیم که هر آدرسی را که به هیچ فایل موجودی اشاره نمی کند دریافت کرده و مثلا به صفحه index.cshtml نگاشت کند.

services

.AddMvc()

.AddRazorPagesOptions(options =>

{

options.Conventions.AddPageRoute("/index", "{*url}");

}

  • دایرکتیو  page@، باید در ابتدای صفحۀ Razor قرار بگیرد. این دایرکتیو رفتار اصلی سایر Razorها را تحت تأثیر قرار می‌دهد.

@page

@using MyApp

@using MyApp.Pages

@using Microsoft.AspNetCore.Mvc.RazorPages

@addTagHelper "*, Microsoft.AspNetCore.Mvc.TagHelpers"

@model ContactModel

<html>

<body>

...

------

sing Microsoft.AspNetCore.Mvc;

using Microsoft.AspNetCore.Mvc.RazorPages;

namespace MyApp.Pages

{

public class ContactModel : PageModel

{

public ContactModel(ApplicationDbContext db)

{

Db = db;

}

[BindProperty]

public Contact Contact { get; set; }

private ApplicationDbContext Db { get; }

public async Task<IActionResult> OnPostAsync()

...

  • کد زیر معادل کد فوق است

@page

@using MyApp

@using Microsoft.AspNetCore.Mvc.RazorPages

@addTagHelper "*, Microsoft.AspNetCore.Mvc.TagHelpers"

@inject ApplicationDbContext Db

@functions {

[BindProperty]

public Contact Contact { get; set; }

public async Task<IActionResult> OnPostAsync()

{

if (ModelState.IsValid)

{

Db.Contacts.Add(Contact);

await Db.SaveChangesAsync();

return RedirectToPage();

}

return Page();

}

}

<html>

<body>

...

  • اگر در تگ img از asp-apend-version استفاده کنیم و مقدار انرا مقداری در انتهای src افزوده میشود که در صورتیکه عکس بروز گردد، از سرور خوانده میشود در غیراینصورت از کش میخواند.

<img src="~/images/asplogo.png" asp-append-version="true">

  • میتوانیم از تگ‌هلپر کش قسمتی از محتوا با مشخص کردن اعتبار آن، برای ارتقا سرعت و پرفورمنس اقدام کرد

<cache expires-after="@TimeSpan.FromSeconds(120)">

@DateTime.Now

</cache>

razorrazorpageviewaspcoremvc
مهندس نرم‌افزار و توسعه‌دهنده وب؛ تکنولوژی و هنر دو عنصر حیاتی زندگیم هستند
شاید از این پست‌ها خوشتان بیاید