در مطلب «ارتقاء به ASP.NET Core 1.0 - قسمت 11 - بررسی بهبودهای Razor» قسمت «نحوهی سفارشی سازی کلاس پایهی تمام Viewهای برنامه و معرفی inherits@ »، این مورد را توضیح دادم. برای نمونه اگر به فایل Views\_ViewStart.cshtml مراجعه کنید، یک چنین مقدار دهی عمومی در آن هست:
این خاصیت عمومی Layout در کلاس پایهی تمام ویووها تعریف شدهاست. اگر میخواهید معادل آنرا داشته باشید، باید یک کلاس سفارشی پایه را با ارث بری از RazorPage ایجاد کنید:
در اینجا چند نکته مهم هستند:
- در کلاس پایهی سفارشی، امکان تزریق وابستگیها در سازندهی کلاس وجود ندارد. اما از طریق ویژگی RazorInject میتوان اینکار را انجام داد.
- RazorInject نیاز به نصب وابستگی ذیل را دارد:
- پس از تعریف این کلاس پایه، برای معرفی آن به فایل Views\_ViewImports.cshtml مراجعه کنید:
اکنون در تمام ویووهای برنامه به خاصیت عمومی MySharedLocalizer واقع در کلاس پایهی سفارشی برنامه، دسترسی خواهید داشت:
@{ Layout = "_Layout"; }
using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.Localization; using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.AspNetCore.Mvc.Razor.Internal; namespace Core1RtmTestResources.StartupCustomizations { public abstract class MyCustomBaseView<TModel> : RazorPage<TModel> { //روش خاص تزریق وابستگیها در فایل ویژهی جاری [RazorInject] public IHtmlLocalizerFactory MyHtmlLocalizerFactory { get; set; } public IHtmlLocalizer MySharedLocalizer => MyHtmlLocalizerFactory.Create( baseName: "SharedResource" /*مشخصات*/, location: "Core1RtmTestResources.ExternalResources" /*نام اسمبلی ثالث*/); public bool IsAuthenticated() { return Context.User.Identity.IsAuthenticated; } #pragma warning disable 1998 public override async Task ExecuteAsync() { } #pragma warning restore 1998 } }
- در کلاس پایهی سفارشی، امکان تزریق وابستگیها در سازندهی کلاس وجود ندارد. اما از طریق ویژگی RazorInject میتوان اینکار را انجام داد.
- RazorInject نیاز به نصب وابستگی ذیل را دارد:
{ "dependencies": { //same as before "Microsoft.AspNetCore.Mvc.Razor": "1.0.0" } }
@using Core1RtmTestResources @using Microsoft.AspNetCore.Mvc.Localization @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @inherits Core1RtmTestResources.StartupCustomizations.MyCustomBaseView<TModel>
MySharedLocalizer from MyCustomBaseView: @MySharedLocalizer["About Title"]