اشتراکها
اشتراکها
1.Visual Studio 2017 15.9 منتشر شد
Issues Fixed in 15.9.1
These are the issues addressed in 15.9.1:
- Fixed a bug where Visual Studio would fail to build projects using the Microsoft Xbox One XDK.
Details of What's New in 15.9.1
Universal Windows Platform Development SDK
The Windows 10 October 2018 Update SDK (build 17763) is now the default selected SDK for the Universal Windows Platform development workload.
نظرات مطالب
خلاصهای در مورد SQL Server CE
وضعیت SQL Server CE در سال 2018
توسعهی فعال این بانک اطلاعاتی مدتها است که توسط مایکروسافت خاتمه یافتهاست. پشتیبانی رسمی آن در تاریخ 2016 -07-12 پایان یافته و پشتیبانی تمدید شدهی آن در تاریخ 2021-07-13 پایان مییابد و بجای آن LocalDB برای کارهای سبک توصیه میشود. همچنین اگر هدف شما کار با بانکهای اطلاعاتی Embedded است، بهتر است از SQLite استفاده کنید. جالب است بدانید هرچند EF Core از SQL Server CE پشتیبانی میکند، اما پروایدر آن توسط مایکروسافت تهیه نشدهاست. برعکس SQLite پشتیبانی کاملی را توسط مایکروسافت پیدا کردهاست؛ چه از لحاظ پروایدر EF Core و چه از لحاظ پروایدر ADO.NET.
درست شد
در صورت پرداخت موفق فیلد TransactionID اطلاعاتش پر میشود
<?xml version="1.0" encoding="utf-8"?> <Log xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Type>Verify</Type> <Gateway>Mellat</Gateway> <OrderNumber>636696338698017740</OrderNumber> <Amount>50000</Amount> <ReferenceId>63610A4322A08FDD</ReferenceId> <TransactionId>139032371054</TransactionId> <Status>Success</Status> <Message>تراکنش با موفقیت انجام شد</Message> <CreatedOn>2018-08-12T01:25:31.1869631+04:30</CreatedOn> </Log>
نظرات مطالب
مدیریت سراسری خطاها در یک برنامهی Angular
به چه صورت میشه متن خطای رخ داده رو نمایش داد ؟
throw new Exception("the message of exception");
خطایی که الان نشون میده
Error! URL:/lab ERROR:HTTP error occurred at 2018-05-07T07:34:32.291Z, message - Http failure response for http://localhost:50442/Master/GetAllMasters: 500 Internal Server Error, Status code - 500
نصب Rust
Cargo چیست و چه کاربردی دارد؟
Cargo همراه با زبان برنامه نویسی Rust گنجانده شده، همزمان نصب میشود و برای ایجاد، ساخت و مدیریت پروژههای Rust استفاده میگردد. این یک رابط سطح بالا برای کار با کدهای Rust را ارائه میدهد که شروع به کار با Rust و مدیریت پروژههای خود را برای توسعه دهندگان آسانتر میکند.
Cargo سیستم ساخت و package manager مخصوص زبان برنامه نویسی Rust است. ابزاری است که به توسعه دهندگان Rust کمک میکند تا پروژههای خود را با خودکارسازی کارهایی مانند کامپایل کد، مدیریت وابستگیها، اجرای آزمایشها و ایجاد بستههای قابل توزیع، مدیریت کنند.
برخی از ویژگیهای Cargo
Dependency management: برنامه Cargo میتواند بهطور خودکار وابستگیهای پروژههای Rust را دانلود کرده، بسازد و مدیریت کند. این باعث میشود توسعه دهندگان به راحتی کتابخانهها و ماژولهای جدیدی را به پروژههای خود اضافه کنند.
Building and testing: برنامه Cargo میتواند پروژههای Rust را بسازد و testها را به صورت خودکار اجرا کند. همچنین گزینههایی را برای ساختن ساختهای بهینه یا اشکال زدایی فراهم میکند.
Packaging: برنامه Cargo میتواند بستههای قابل توزیعی را مانند tarballs یا بستههای باینری را برای پروژههای Rust ایجاد کند.
Customization: برنامه Cargo به توسعه دهندگان اجازه میدهد تا فرآیند ساخت برنامهی خود را با تعیین گزینههای ساخت مختلف، در فایل پیکربندی Cargo.toml سفارشی کنند. بهطور کلی Cargo توسعه و مدیریت پروژههای Rust را با ارائه یک ابزار کارآمد برای خودکارسازی بسیاری از وظایف توسعه رایج، ساده میکند.
هنگامیکه یک پروژهی جدید Rust را با استفاده از نام پروژهی مورد نظر ایجاد میکنید، یک دایرکتوری با نام داده شده، حاوی فایلها و دایرکتوریهای زیر ایجاد میگردد:
Cargo.toml : این فایل manifest پروژه است که در آن نام پروژه، نسخه، وابستگیها و سایر ابردادهها را مشخص میکنید. فایل Cargo.toml حاوی یک metadata درباره پروژه است؛ مانند نام، نسخه، نویسندگان و وابستگیهای آن. در اینجا مثالی از شکل ظاهری یک فایل Cargo.toml آورده شده است:
بخش [package] حاوی یک metadata در مورد خود پروژه، از جمله نام، نسخه، نویسندگان و جزئیات دیگر است.
بخش [dependencies] وابستگیهای پروژه را فهرست میکند. در این مثال، پروژه به پکیجهای serde و serde_json بستگی دارد که برای serialization و deserialization دادهها استفاده میشوند.
src directory: این دایرکتوری حاوی کد منبع پروژه شما است. به طور پیش فرض، شامل یک فایل main.rs است که نقطه ورود برنامه شما است.
target directory: این فهرست شامل فایلهای باینری کامپایل شده تولید شده توسط کامپایلر Rust میباشد.
هنگامی که cargo build یا cargo run را اجرا میکنید، Cargo به طور خودکار یک دایرکتوری target/debug را برای ذخیرهی فایلهای باینری کامپایل شده ایجاد میکند. اگر cargo build --release را اجرا کنید، Cargo بجای آن، یک دایرکتوری target/release را ایجاد میکند. بعلاوه، اگر هنگام ایجاد پروژهی خود از نسخهی خاصی از Rust (مانند نسخهی 2018) استفاده کنید، Cargo یک فیلد نسخه را در فایل Cargo.toml شما برای تعیین نسخه، اضافه میکند.
برای نصب rust، متناسب با سیستم عامل خود، ابتدا وارد سایت rustup شوید و فایل دانلود متناسب با سیستم عامل مورد نظرتان را دانلود و نصب کنید.
Cargo چیست و چه کاربردی دارد؟
Cargo همراه با زبان برنامه نویسی Rust گنجانده شده، همزمان نصب میشود و برای ایجاد، ساخت و مدیریت پروژههای Rust استفاده میگردد. این یک رابط سطح بالا برای کار با کدهای Rust را ارائه میدهد که شروع به کار با Rust و مدیریت پروژههای خود را برای توسعه دهندگان آسانتر میکند.
Cargo سیستم ساخت و package manager مخصوص زبان برنامه نویسی Rust است. ابزاری است که به توسعه دهندگان Rust کمک میکند تا پروژههای خود را با خودکارسازی کارهایی مانند کامپایل کد، مدیریت وابستگیها، اجرای آزمایشها و ایجاد بستههای قابل توزیع، مدیریت کنند.
Dependency management: برنامه Cargo میتواند بهطور خودکار وابستگیهای پروژههای Rust را دانلود کرده، بسازد و مدیریت کند. این باعث میشود توسعه دهندگان به راحتی کتابخانهها و ماژولهای جدیدی را به پروژههای خود اضافه کنند.
Building and testing: برنامه Cargo میتواند پروژههای Rust را بسازد و testها را به صورت خودکار اجرا کند. همچنین گزینههایی را برای ساختن ساختهای بهینه یا اشکال زدایی فراهم میکند.
Packaging: برنامه Cargo میتواند بستههای قابل توزیعی را مانند tarballs یا بستههای باینری را برای پروژههای Rust ایجاد کند.
Customization: برنامه Cargo به توسعه دهندگان اجازه میدهد تا فرآیند ساخت برنامهی خود را با تعیین گزینههای ساخت مختلف، در فایل پیکربندی Cargo.toml سفارشی کنند. بهطور کلی Cargo توسعه و مدیریت پروژههای Rust را با ارائه یک ابزار کارآمد برای خودکارسازی بسیاری از وظایف توسعه رایج، ساده میکند.
ایجاد اولین پروژهی Rust
بعد از نصب rust برای ایجاد یک پروژه جدید، terminal سیستم عامل را باز کنید و دستور زیر را در آن وارد کنید:
cargo new project_name
Cargo.toml : این فایل manifest پروژه است که در آن نام پروژه، نسخه، وابستگیها و سایر ابردادهها را مشخص میکنید. فایل Cargo.toml حاوی یک metadata درباره پروژه است؛ مانند نام، نسخه، نویسندگان و وابستگیهای آن. در اینجا مثالی از شکل ظاهری یک فایل Cargo.toml آورده شده است:
[package] name = "my-project" version = "0.1.0" authors = ["John Doe <johndoe@example.com>"] [dependencies] serde = "1.0" serde_json = "1.0"
بخش [dependencies] وابستگیهای پروژه را فهرست میکند. در این مثال، پروژه به پکیجهای serde و serde_json بستگی دارد که برای serialization و deserialization دادهها استفاده میشوند.
src directory: این دایرکتوری حاوی کد منبع پروژه شما است. به طور پیش فرض، شامل یک فایل main.rs است که نقطه ورود برنامه شما است.
target directory: این فهرست شامل فایلهای باینری کامپایل شده تولید شده توسط کامپایلر Rust میباشد.
هنگامی که cargo build یا cargo run را اجرا میکنید، Cargo به طور خودکار یک دایرکتوری target/debug را برای ذخیرهی فایلهای باینری کامپایل شده ایجاد میکند. اگر cargo build --release را اجرا کنید، Cargo بجای آن، یک دایرکتوری target/release را ایجاد میکند. بعلاوه، اگر هنگام ایجاد پروژهی خود از نسخهی خاصی از Rust (مانند نسخهی 2018) استفاده کنید، Cargo یک فیلد نسخه را در فایل Cargo.toml شما برای تعیین نسخه، اضافه میکند.
دیروز (25 ماه May سال 2018) اولین روز فعالسازی GDPR یا General Data Protection Regulation بود و به همین خاطر است که اگر به سرویسهای مهم اینترنتی دقت کرده باشید، پر شدهاست از پیامهایی مانند «ما از کوکی استفاده میکنیم»، «ما اطلاعات شما را به این صورت ذخیره میکنیم» و امثال آن. همچنین تعداد زیادی از سرویسهای اینترنتی نیز به کاربران خود پیامهایی را جهت تائید قوانین جدید رعایت حریم خصوصی آنها ارسال کردهاند. برای مثال اگر این قوانین جدید را تائید نکنید، از دریافت بسیاری از خبرنامهها محروم خواهید شد. این مورد نیز از بخشنامهی اتحادیهی اروپا نشات میگیرد که از روز جمعه ۲۵ می(۴ خرداد) تمامی شرکتها، افراد، وبسایتها و ارائهدهندگان خدمات آنلاین، موظف به رعایت آن هستند. موضوع بخشنامه قبل از هرچیزی، حفاظت از اطلاعات خصوصی کاربران است. نهادها و شرکتها و وبسایتهایی که تا ۲۵ می۲۰۱۸ زمینه اجرای این بخشنامه را فراهم نکرده باشند، در خطر جریمههای سنگین هستند. بخشنامه جدید حریم خصوصی اطلاعات، تعیین میکند که چه میزان اطلاعاتی دربارهی هرکسی میتواند جمعآوری و بررسی شود، مورد پردازش قرار گیرد و البته تبدیل به پول شود. این بخشنامه حق تکتک کاربران، بر اطلاعاتشان را تقویت میکند. کاربران حالا حق بیشتری بر اطلاعاتشان، برای «پاک کردن» آنها و «پسگرفتن» آنها دارند. البته آنچه که احتمالا برای همه قابل رؤیت خواهد بود توضیحات مربوط به حفاظت از اطلاعات در وبسایتها است. این توضیحات باید جزئیتر و دقیقتر و برای مخاطبان قابل فهمتر باشند و این به این معنا است که این توضیحات بهمراتب طولانیتر خواهند شد.
در این بین اگر به قالب پیشفرض پروژههای MVC تولید شدهی توسط ASP.NET Core 2.1 نیز دقت کنید، پشتیبانی توکار از پیشنیازهای GDPR در آن لحاظ شدهاست؛ چه از لحاظ گوشزد کردن شرایط حریم خصوصی و پذیرش آن و چه از لحاظ «پاک کردن» و «پس گرفتن» اطلاعات شخصی.
قالب و کوکی پذیرش شرایط حریم خصوصی سایت (Cookie Consent)
اگر قالب پیشفرض یک پروژهی ASP.NET Core 2.1 را اجرا کنید، تصویر فوق را که در آن نوار پذیرش شرایط حریم خصوصی سایت در بالای صفحه درج شدهاست، مشاهده خواهید کرد.
قالب جدید نوار پذیرش شرایط حریم خصوصی در مسیر Views\Shared\_CookieConsentPartial.cshtml واقع شدهاست و در فایل layout برنامه توسط tag helper جدید Partial، رندر و نمایش داده میشود:
در ابتدای این partial view، یک چنین کدهایی درج شدهاند:
بنابراین پذیرش شخص را در یک کوکی درج میکند و در دفعات بعدی بازدید او بر اساس این کوکی است که در مورد نمایش یا عدم نمایش این نوار پذیرش شرایط، تصمیم گیری خواهد شد. این کوکی نیز که تحت عنوان میانافزار CookiePolicy در سیستم مدیریت و پردازش میشود، به صورت زیر در فایل آغازین برنامه مدیریت میگردد:
الف) تنظیم نیاز به دریافت پذیرش
علاوه بر Cookie Consent فوق که در یک قالب ابتدایی MVC نیز درج شدهاست، در قالب پروژههای ASP.NET Core Identity، دو گزینهی جدید دریافت اطلاعات شخصی و همچنین حذف اکانت (دادن حق فراموشی به کاربران) نیز پیشبینی شدهاست: PersonalData.cshtml
البته این صفحه جزو بستهی جدید Microsoft.AspNetCore.Identity.UI است که به همراه ASP.NET Core 2.1 ارائه میشود:
در این بسته تمام کدها و صفحات مخصوص Identity به داخل یک Class library جدید منتقل شدهاند و دیگر جزو قالب پروژهی «dotnet new mvc --auth Individual» یا همان تنظیم اعتبارسنجی به individual user accounts نیستند و باید به صورت جداگانه دریافت و تنظیم شوند (اختیاری است).
در این بین اگر به قالب پیشفرض پروژههای MVC تولید شدهی توسط ASP.NET Core 2.1 نیز دقت کنید، پشتیبانی توکار از پیشنیازهای GDPR در آن لحاظ شدهاست؛ چه از لحاظ گوشزد کردن شرایط حریم خصوصی و پذیرش آن و چه از لحاظ «پاک کردن» و «پس گرفتن» اطلاعات شخصی.
قالب و کوکی پذیرش شرایط حریم خصوصی سایت (Cookie Consent)
اگر قالب پیشفرض یک پروژهی ASP.NET Core 2.1 را اجرا کنید، تصویر فوق را که در آن نوار پذیرش شرایط حریم خصوصی سایت در بالای صفحه درج شدهاست، مشاهده خواهید کرد.
قالب جدید نوار پذیرش شرایط حریم خصوصی در مسیر Views\Shared\_CookieConsentPartial.cshtml واقع شدهاست و در فایل layout برنامه توسط tag helper جدید Partial، رندر و نمایش داده میشود:
<partial name="_CookieConsentPartial" />
@using Microsoft.AspNetCore.Http.Features @{ var consentFeature = Context.Features.Get<ITrackingConsentFeature>(); var showBanner = !consentFeature?.CanTrack ?? false; var cookieString = consentFeature?.CreateConsentCookie(); }
الف) تنظیم نیاز به دریافت پذیرش
public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; });
ب) فعالسازی میانافزار مدیریت کوکی پذیرش شرایط حریم خصوصی
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // ... app.UseCookiePolicy();
دادن حق فراموش شدن به کاربران
علاوه بر Cookie Consent فوق که در یک قالب ابتدایی MVC نیز درج شدهاست، در قالب پروژههای ASP.NET Core Identity، دو گزینهی جدید دریافت اطلاعات شخصی و همچنین حذف اکانت (دادن حق فراموشی به کاربران) نیز پیشبینی شدهاست: PersonalData.cshtml
البته این صفحه جزو بستهی جدید Microsoft.AspNetCore.Identity.UI است که به همراه ASP.NET Core 2.1 ارائه میشود:
dotnet add package Microsoft.AspNetCore.Identity.UI --version 2.1.0-rc1-final
با تعدادی از کامپوننتهای Bootstrap در مطلب «نگاهی به اجزای تعاملی Twitter Bootstrap» آشنا شدید. یکی دیگر از این افزونهها، Typeahead نام دارد که در حقیقت نوعی Autocomplete text box است. در ادامه قصد داریم نحوه استفاده از آنرا در ASP.NET MVC بررسی کنیم.
استفادهی استاتیک از افزونه Typeahead
منظور از استفادهی استاتیک، مشخص بودن آرایه عناصر و هچنین درج آن به صورت html encoded در صفحه است. برای این منظور، کنترلر برنامه چنین شکلی را خواهد داشت:
در اینجا یک آرایه با تعداد عناصر مشخص، تبدیل به رشته JSON معادل آن شده و توسط ViewBag.JsonString به View ارسال میشود.
View متناظر با آن به نحو ذیل با مشخص سازی نوع data-provide (تا به کتابخانهی جاوا اسکریپتی همراه bootstrap اعلام کند از چه افزونهای در اینجا قرار است استفاده شود)، منبع داده data-source و حداکثر تعداد آیتم ظاهر شونده data-items، میتواند طراحی شود:
به این ترتیب، یک چنین خروجی در صفحه درج میشود:
همانطور که ملاحظه میکنید دقیقا data-source تهیه شده مطابق نیاز خاص این افزونه، html encoded است. به علاوه هر جایی در htmlAttributes صفحه از under line استفاده شده، در این سمت به صورت خودکار به - ترجمه گردیده است.
اگر هم بخواهیم برای آن یک Html Helper درست کنیم، میتوان به نحو ذیل عمل کرد:
استفاده پویا و Ajax ایی از افزونه Typeahead
اگر بخواهیم data-source را به صورت پویا، هربار از بانک اطلاعاتی دریافت و ارائه دهیم، نیاز به کمی اسکریپت نویسی خواهد بود:
در این حالت، کدهای اکشن متدی که یک عبارت، یا قسمتی از آن را از طریق پارامتر term دریافت و خروجی JSON مناسبی را ارائه میکند، همانند متد GetNames فوق خواهد بود.
سپس در تعاریف View، قسمت data-source مرتبط با TextBox حذف و از طریق فراخوانی مستقیم کدهای افزونه typeahead مقدار دهی میگردد:
در اینجا توسط متد getJSON کتابخانه jQuery، مقدار عبارت وارد شده در TextBox جستجو، به آدرس اکشن متد GetNames ارسال و سپس حاصل به source افزونه typeahead انتساب داده میشود.
استفادهی استاتیک از افزونه Typeahead
منظور از استفادهی استاتیک، مشخص بودن آرایه عناصر و هچنین درج آن به صورت html encoded در صفحه است. برای این منظور، کنترلر برنامه چنین شکلی را خواهد داشت:
using System.Web.Mvc; using System.Web.Script.Serialization; namespace Mvc4TwitterBootStrapTest.Controllers { public class HomeController : Controller { [HttpGet] public ActionResult Index() { var array = new[] { "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", "Antarctica", "Antigua and/or Barbuda" }; ViewBag.JsonString = new JavaScriptSerializer().Serialize(array); return View(); } } }
View متناظر با آن به نحو ذیل با مشخص سازی نوع data-provide (تا به کتابخانهی جاوا اسکریپتی همراه bootstrap اعلام کند از چه افزونهای در اینجا قرار است استفاده شود)، منبع داده data-source و حداکثر تعداد آیتم ظاهر شونده data-items، میتواند طراحی شود:
@{ ViewBag.Title = "Index"; } <h2> Typeahead</h2> @Html.TextBox("search", null, htmlAttributes: new { autocomplete = "off", data_provide = "typeahead", data_items = 8, data_source = @ViewBag.JsonString })
<input autocomplete="off" data-items="8" data-provide="typeahead" data-source="["Afghanistan","Albania","Algeria","American Samoa","Andorra","Angola","Anguilla","Antarctica","Antigua and/or Barbuda"]" id="search" name="search" type="text" value="" />
اگر هم بخواهیم برای آن یک Html Helper درست کنیم، میتوان به نحو ذیل عمل کرد:
public static MvcHtmlString TypeaheadFor<TModel, TValue>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, IEnumerable<string> source, int items = 8) { var jsonString = new JavaScriptSerializer().Serialize(source); return htmlHelper.TextBoxFor( expression, new { autocomplete = "off", data_provide = "typeahead", data_items = items, data_source = jsonString } ); }
استفاده پویا و Ajax ایی از افزونه Typeahead
اگر بخواهیم data-source را به صورت پویا، هربار از بانک اطلاعاتی دریافت و ارائه دهیم، نیاز به کمی اسکریپت نویسی خواهد بود:
using System; using System.Linq; using System.Web.Mvc; using System.Web.Script.Serialization; namespace Mvc4TwitterBootStrapTest.Controllers { public class HomeController : Controller { [HttpGet] public JsonResult GetNames(string term) { var array = new[] { "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", "Antarctica", "Antigua and/or Barbuda" }; var results = array.Where(n => n.StartsWith(term, StringComparison.OrdinalIgnoreCase)); return Json(results.ToArray(), JsonRequestBehavior.AllowGet); } } }
سپس در تعاریف View، قسمت data-source مرتبط با TextBox حذف و از طریق فراخوانی مستقیم کدهای افزونه typeahead مقدار دهی میگردد:
@{ ViewBag.Title = "Index"; var url = Url.Action("GetNames", "Home"); } <h2> Typeahead</h2> @Html.TextBox("search", null, htmlAttributes: new { autocomplete = "off", data_provide = "typeahead", data_items = 8 }) @section JavaScript { <script type="text/javascript"> $(function () { $('#search').typeahead({ source: function (term, process) { return $.getJSON('@url', { term: term }, function (data) { return process(data); }); } }); }); </script> }
نیاز به کمی تغییر دارد. اگر خروجی اکشن متد شما به این نحو باشد:
در سمت اسکریپت در $.ajax:
return json(new { result = "ok" });
//... success: function (data) { if (data) { alert("json data: " + data.result); } }