اگر پیشتر با فناوریهای مرتبط با خانوادهی ASP.NET کار کرده باشید، با مفاهیمی مانند ContentPlaceHolder در وبفرمها و یا RenderSection در ASP.NET MVC، برخورد داشتهاید. دقیقا یک چنین قابلیتی نیز به Blazor 8x تحت عنوان Sections اضافه شدهاست تا توسط آن بتوان محتوای قسمتی از قالب کلی صفحه را از طریق زیر کامپوننتهای آن تغییر داد و کنترل کرد. کامپوننتهای جدید SectionOutlet و SectionContent در Blazor 8x پیاده سازی Sections در Blazor 8x به کمک دو کامپوننت جدید SectionOutlet و SectionContent میسر شدهاست و برای دسترسی به آنها نیاز است ابتدا به فایل Imports.razor_ پروژه، مراجعه کرد و using زیر را به آن اضافه نمود تا این اشیاء، در کامپوننتهای برنامه قابل شناسایی و استفاده شوند: @using Microsoft.AspNetCore.Components.Sections SectionOutlet کامپوننتی است که محتوای ارائه شدهی توسط کامپوننت SectionContent را رندر میکند (این محتوا در اصل یک RenderFragment است). ارتباط بین این دو هم توسط خواص SectionName و یا SectionIdهای متناظر، برقرار میشود. اگر چندین SectionContent دارای نام و یا Id یکسانی باشند، محتوای آخرین آنها در SectionOutlet متناظر، رندر میشود. برای مثال در فایل MainLayout.razor، تغییر زیر را اعمال میکنیم: <div class="top-row px-4"> <SectionOutlet SectionName="before-top-row"/> <a href="https://lea.microsoft.com/aspnet/core/" target="_blank">About</a> </div> که در آن یک SectionOutlet، با نام before-top-row اضافه شدهاست و سبب درج محتوایی پیش از لینک About میشود. پس از این تعریف، اکنون در هر کامپوننتی از برن, ...ادامه مطلب
در Blazor 8x میتوان صفحات SSR ای را به همراه Blazor server islands و یا Blazor WASM islands داشت؛ یعنی یک کامپوننت Blazor Server که داخل یک صفحهی معمولی SSR قرار گرفته و با سرور، ارتباط SiganlR برقرار میکند و یا یک کامپوننت Blazor WASM که در قسمتی از صفحهی SSR درج شده و درون مرورگر کاربر اجرا میشود. به هر کدام از اینها یک «جزیرهی تعاملی» گفته میشود (interactive island). در این قسمت، نکات مرتبط با جزایر تعاملی Blazor Server را بررسی میکنیم. بررسی یک مثال: تهیه یک برنامهی Blazor 8x برای نمایش لیست محصولات، به همراه جزئیات آنها به لطف وجود SSR در Blazor 8x، میتوان HTML نهایی کامپوننتها و صفحات Blazor را همانند صفحات MVC و یا Razor pages، در سمت سرور تهیه و بازگشت داد. این خروجی در نهایت یک static HTML بیشتر نیست و گاهی از اوقات ما به بیش از یک خروجی ساده HTML ای نیاز داریم. در این مثال که بر اساس قالب dotnet new blazor --interactivity Server تهیه میشود، قصد داریم موارد زیر را پیاده سازی کنیم: - صفحهای که یک لیست محصولات فرضی را نمایش میدهد : بر اساس SSR - صفحهای که جزئیات یک محصول را نمایش میدهد: بر اساس SSR - دکمهای در ذیل قسمت نمایش جزئیات یک محصول، برای دریافت و نمایش لیست محصولات مشابه و مرتبط: بر اساس Blazor server islands یعنی تا جائیکه ممکن است قصد نداریم تمام صفحات و تمام قسمتهای برنامه را با فعالسازی سراسری حالت تعاملی Blazor server که در قسمتهای قبل در مورد آن توضیح داده شد، پیاده سازی کنیم. میخواهیم فقط قسمت کوچکی از این سناریو را که واقعا نیاز به یک چنین قابلیتی را دارد، توسط یک جزیرهی تعاملی Blazor s, ...ادامه مطلب
در قسمتهای قبل، نحوهی تعریف جزیرههای تعاملی Blazor Server را به همراه نکات مرتبط با آنها بررسی کردیم. برای مثال مشاهده کردیم که چون Blazor Server و SSR هر دو بر روی سرور اجرا میشوند، از لحاظ دسترسی به اطلاعات و کار با سرویسها، هماهنگی کاملی دارند و میتوان کدهای یکسان و یکدستی را در اینجا بکار گرفت. در Blazor 8x، امکان تعریف جزیرههای تعاملی Blazor WASM نیز وجود دارد که به همراه تعدادی نکتهی ویژه، در مورد نحوهی مدیریت سرویسهای مورد استفادهی در این کامپوننتها است. معرفی برنامهی Blazor WASM این مطلب در این مطلب قصد داریم دقیقا قسمت جزیرهی تعاملی Blazor Server همان برنامهی مطلب قبل را توسط یک جزیرهی تعاملی Blazor WASM بازنویسی کنیم و با نکات و تفاوتهای ویژهی آن آشنا شویم. یعنی زمانیکه صفحهی SSR نمایش جزئیات یک محصول ظاهر میشود، نحوهی رندر و پردازش کامپوننت نمایش محصولات مرتبط و مشابه، اینبار یک جزیرهی تعاملی Blazor WASM باشد. بنابراین قسمت عمدهای از کدهای این دو قسمت یکی است؛ فقط نحوهی دسترسی به سرویسها و محل قرارگیری تعدادی از فایلها، متفاوت خواهد بود. ایجاد یک پروژهی جدید Blazor WASM تعاملی در دات نت 8 بنابراین در ادامه، در ابتدای کار نیاز است یک پوشهی جدید را برای این پروژه، ایجاد کرده و بجای انتخاب interactivity از نوع Server: dotnet new blazor --interactivity Server اینبار برای اجرای در مرورگر توسط فناوری وباسمبلی، نوع WebAssembly را انتخاب کنیم: dotnet new blazor --interactivity WebAssembly در این حالت، Solution ای که ایجاد میشود، به همراه دو پروژهاست (برخلاف پروژههای Blazor Server تعاملی که فقط شامل یک پروژهی سمت , ...ادامه مطلب
اگر برنامههای مبتنی بر SQL Server خود را به EF 7.0 ارتقاء دهید، در حین اجرای برنامه، به خطای زیر برخواهید خورد: A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - The certificate chain was issued by an authority that is not trusted.) علت اینجا است که پروایدر SQL Server مخصوص EF 7.0، از نگارش جدید Microsoft.Data.SqlClient استفاده میکند و در این نگارش، تنظیم Encrypt=True، به صورت پیشفرض اعمال شدهاست. این تنظیم، پیشتر به صورت Encrypt=False وجود داشت و به همین جهت عموما در حین تعریف رشتههای اتصالی دیده نمیشد. اگر نیاز به استفادهی از پرچم Encrypt=True وجود داشته باشد: - باید سرور اس کیوال با یک certificate معتبر تنظیم شود. - کلاینت باید این certificate را تائید کند. اگر کلاینت چنین قصدی را ندارد، میتواند تنظیم TrustServerCertificate=True را به رشتهی اتصالی اضافه کند. در غیراینصورت، خطای ذکر شده را دریافت خواهیم کرد. برای رفع این مشکل یا باید رمزنگاری اتصالات را در SQL Server پیاده سازی کرد و یا از این پس، ذکر پرچم Encrypt=False در انتهای رشتهی اتصالی به آن، ضروری است. برای مثال یک نمونه رشتهی اتصالی تغییر یافتهی بر اساس این تنظیم، به صورت زیر است: Data Source=.SQLEXPRESS;Initial Catalog=MyTestDb;Integrated Security=true;Encrypt=False; بدیهی است این تغییر مختص به EF 7.0 نیست و تمام برنامههایی که از ADO.NET و نگارش جدید Microsoft.Data.SqlClient استفاده میکنند، باید به آن توجه داشته باشند. , ...ادامه مطلب
امکان داشتن اعضای static abstract در اینترفیسها شاید عجیب بهنظر برسد یا حتی غیرضروری؛ اما در C# 11، پایهی قابلیت جدیدی به نام «ریاضیات جنریک» شدهاست. به همین جهت در ابتدا نیاز است با اعضای static abstract آشنا شد و در قسمتی دیگر به «ریاضیات جنریک» پرداخت. مثالی جهت توضیح علت نیاز به اعضای static abstract در اینترفیسها فرض کنید قصد داریم حاصل جمع اعضای یک آرایهی int را محاسبه کنیم: namespace CS11Tests; public class StaticAbstractMembers { public static void Test() { var sum = AddAll(new[] { 1, 2, 3, 4 }); Console.WriteLine(sum); } private static int AddAll(int[] values) { int result = 0; foreach (var value in values) { result += value; } retu result; } } روش متداول اینکار را در اینجا ملاحظه میکنید که حلقهای بر روی عناصر آرایه، جهت یافتن حاصل جمع آنها تشکیل شدهاست. اکنون فرض کنید بجای آرایهای که در متد Test استفاده شده، از آرایهی زیر استفاده شود: var sum = AddAll(new[] { 1, 2, 3, 4, 0.68 }); اینبار با خطای زیر متوقف میشویم: Argument 1: cannot convert from 'double[]' to 'int[]' [CS11Tests]csharp(CS1503) عنوان میکند که آرایهی مدنظر از نوع []double تشخیص داده شدهاست و متد AddAll، تنها آرایههای از نوع int را قبول میکند. در جهت رفع این مشکل شاید بهتر باشد نمونهی جنریک متد AddAll را ایجاد کنیم، تا بتوان انواع و اقسام نوعهای ممکن را به آن ارسال کرد: private static T AddAll<T>(T[] values) { T result = 0; foreach (var value in values), ...ادامه مطلب
به صورت پیشفرض، رشتهها در زبان #C، از نوع UTF-16 تعریف شدهاند؛ درحالیکه اکثر رشتهها در دنیای اینترنت و پروتکلهای آن، از نوع UTF-8 هستند. برای کاهش سربار کارآیی این تبدیلها، اکنون در C# 11 میتوانید رشتهها را با پسوند u8 نیز معرفی کنید تا از ابتدای کار، به صورت UTF-8 پردازش شوند. یک مثال: // C# 10 string utf16String = "Hello World"; byte[] array1 = Encoding.UTF8.GetBytes(utf16String); // C# 11 ReadOnlySpan<byte> utf8String = "Hello World"u8; byte[] array2 = utf8String.ToArray(); در اینجا نحوهی تعریف یک رشتهی UTF-8 را توسط پسوند u8 در مثال دوم مشاهده میکنید. این رشته با نوع <ReadOnlySpan<byte معرفی میشود که به همراه عدم نیاز به استفاده از متد Encoding.UTF8.GetBytes قبلی و همچنین تخصیص حافظهی رشتهی UTF-16 آن در مثال اول است. اگر میخواهید معادل آرایهی تغییرپذیر آنرا (mutable array) داشته باشید، باید از متد ()ToArray بر روی آن استفاده کنید. افزایش خوانایی رشتههای UTF-8 در C# 11 یکی دیگر از مزیتهای این روش تعریف، علاوه بر بالا رفتن کارآیی کار با رشتههای UTF-8، بالا بردن امکان خوانایی و درک آنها است. برای مثال AuthStringLiteral مثال زیر، همان معادل آرایهی AuthWithTrailingSpace است که خوانایی بیشتری دارد: ReadOnlySpan<byte> AuthWithTrailingSpace = new byte[] { 0x41, 0x55, 0x54, 0x48, 0x20 }; ReadOnlySpan<byte> AuthStringLiteral = "AUTH "u8; چند مثال دیگر: var helloUtf8 = "hello"u8;// new byte[] { 0x68, 0x65, 0x6c, 0x6c, 0x6f } var dogUtf8 = "dog"u8;// new byte[] { 0x64, 0x6f, 0x67 } var catUtf8 = "cat"u8;// new byte[] { 0x63, , ...ادامه مطلب