بررسی تغییرات Blazor 8x - قسمت ششم - نکات تکمیلی ویژگی راهبری بهبود یافتهی صفحات SSR
نویسنده: وحید نصیری
تاریخ: ۱۴۰۲/۰۸/۲۴ ۱۲:۳۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
<a href="/not-blazor" data-enhance-nav="false">A non-Blazor page</a>
<form method="post" @onsubmit="() => submitted = true" @formname="name" data-enhance>
<AntiforgeryToken />
<InputText @bind-Value="Name" />
<button>Submit</button>
</form>
@if (submitted)
{
<p>Hello @Name!</p>
}
@code {
bool submitted;
[SupplyParameterFromForm]
public string Name { get; set; } = "";
} <EditForm method="post" Model="NewCustomer" OnValidSubmit="() => submitted = true" FormName="customer" Enhance>
<DataAnnotationsValidator />
<ValidationSummary/>
<p>
<label>
Name: <InputText @bind-Value="NewCustomer.Name" />
</label>
</p>
<button>Submit</button>
</EditForm>
@if (submitted)
{
<p id="pass">Hello @NewCustomer.Name!</p>
}
@code {
bool submitted = false;
[SupplyParameterFromForm]
public Customer? NewCustomer { get; set; }
protected override void OnInitialized()
{
NewCustomer ??= new();
}
public class Customer
{
[StringLength(3, ErrorMessage = "Name is too long")]
public string? Name { get; set; }
}
} <div data-permanent>
Leave me alone! I've been modified dynamically.
</div> <script>
Blazor.addEventListener('enhancedload', () => {
console.log('enhanced load event occurred');
});
</script> <div class="border border-info rounded bg-info" style="height:500px"></div> <h2 id="targetElement">Target H2 heading</h2> <p>Content!</p>
<a href="/counter#targetElement">
<NavLink href="/counter#targetElement">
Navigation.NavigateTo("/counter#targetElement"); <a href="redirect" data-enhance-nav="false">
GET without enhanced navigation
</a><script src="/_framework/blazor.web.js" autostart="false"></script>
<script>
Blazor.start({
ssr: { disableDomPreservation: true }
});
</script><script>
window.interceptNavigation = () => {
let currentUrl = window.location.href;
Blazor.addEventListener('enhancedload', () => {
let newUrl = window.location.href;
if (currentUrl != newUrl) {
window.scrollTo({ top: 0, left: 0, behavior: 'instant' });
}
currentUrl = newUrl;
});
};
document.onload += window.interceptNavigation();
</script>.NET Model) همچنان به عنوان تنها مرجع حقیقت (Single Source of Truth) برای قوانین اعتبارسنجی باقی میماند. شما نیازی به نوشتن کدهای موازی جاوااسکریپت برای چک کردن فرمها ندارید.نکته تکمیلی: این ویژگی به صورت پیشفرض برای تمامی فرمهای SSR که از کامپوننت استفاده میکنند، فعال است. نکته جالب اینجاست که این قابلیت هم از فرمهای معمولی و هم از فرمهای بهبودیافته (Enhanced Forms که با استفاده از Fetch API فرم را ارسال میکنند و صفحه را کاملاً Refresh نمیکنند) پشتیبانی میکند.
EditForm و DataAnnotationsValidator استفاده کنید. در ادامه یک نمونه فرم ثبتنام ساده و خوانا آورده شده است:<EditForm Model="Model" Enhance FormName="registration" OnValidSubmit="HandleValidSubmit">
<DataAnnotationsValidator />
<div>
<label for="Email">ایمیل</label>
<InputText @bind-Value="Model!.Email" id="Email" />
<ValidationMessage For="@(() => Model!.Email)" />
</div>
<div>
<label for="Password">رمز عبور</label>
<InputText @bind-Value="Model!.Password" id="Password" type="password" />
<ValidationMessage For="@(() => Model!.Password)" />
</div>
<div>
<label for="ConfirmPassword">تکرار رمز عبور</label>
<InputText @bind-Value="Model!.ConfirmPassword" id="ConfirmPassword" type="password" />
<ValidationMessage For="@(() => Model!.ConfirmPassword)" />
</div>
<div>
<button type="submit" id="submit-btn">ثبت نام</button>
</div>
</EditForm>
@code {
[SupplyParameterFromForm]
private RegistrationModel? Model { get; set; }
protected override void OnInitialized() => Model ??= new();
private void HandleValidSubmit()
{
// این متد تنها زمانی اجرا میشود که اعتبارسنجی سمت کاربر و سمت سرور هر دو پاس شوند.
}
}using System.ComponentModel.DataAnnotations;
public class RegistrationModel
{
[Required(ErrorMessage = "وارد کردن ایمیل الزامی است.")]
[EmailAddress(ErrorMessage = "فرمت ایمیل وارد شده صحیح نیست.")]
public string Email { get; set; }
[Required(ErrorMessage = "وارد کردن رمز عبور الزامی است.")]
[StringLength(100, MinimumLength = 8, ErrorMessage = "رمز عبور باید حداقل ۸ کاراکتر باشد.")]
public string Password { get; set; }
[Required(ErrorMessage = "تکرار رمز عبور الزامی است.")]
[Compare("Password", ErrorMessage = "رمز عبور و تکرار آن مطابقت ندارند.")]
[Display(Name = "Confirm Password")]
public string ConfirmPassword { get; set; }
}