ASP.NET Core applications can be tested with different testing
frameworks and Entity Framework Core makes testing specially easy by
removing different technical problems from our way by using in-memory
data provider. This blog posts shows how to unit test controllers that
use data from Entity Framework Core.
اشتراکها
استفاده از Sql View
اشتراکها
جداول Temporal در SQL Server 2016
When you try to teach something to someone else, you have to go through this process in your own mind. You have to take that mess of data, sort it out, repackage it and organize it in a way that someone else can understand. This process forces you to reorganize the way that data is stored in your own head
اشتراکها
خواندن و نوشتن فایل CSV در #C
A common requirement is to have applications share data with other programs. Although there are interfaces available to work with, for example, Microsoft Excel data files, this approach is generally complex, involves a fair amount of overhead, and requires that support libraries accompany your application
When you use the +, -, *, /, or % arithmetic operators to perform implicit or explicit conversion of int, smallint, tinyint, or bigint constant values to the float, real, decimal or numeric data types, the rules that SQL Server applies when it calculates the data type and precision of the expression results differ depending on whether the query is autoparameterized or not.
این مسایل ربطی به این کتابخانه ندارد.
The unconfigured reference in each instance of Application
Insights telemetry indicates that this application isn't associated with
an ikey. The data that's generated while your app is running isn't sent
to Azure. The data is available only for local search and analysis.
نظرات مطالب
سیلورلایت 5 و تاریخ شمسی
با سلام و تشکر
جناب نصیری این مورد رو هم قبلا چک کردم که با پیغام خطای زیر مواجه شدم
Silverlight does not enable you to directly enumerate over a data service query. This is because enumeration automatically send a synchronous request to the data service. Because Silverlight only supports asynchronous operations, you must instead call BeginExecute and EndExecute method to obtain a query result that supports enumeration.
در قسمت دوم، قالب نمایش ردیفهای جدول، ثابت است و درون جدول به صورت مستقیمی درج و تعریف شدهاست. در ادامه میخواهیم این گرید را به نحوی تغییر دهیم که به ازای حالتهای مختلفی مانند نمایش اطلاعات و یا ویرایش اطلاعات هر ردیف، از قالبهای خاص آنها استفاده شود.
قابلیتی که در ادامه از آن برای «قالب پذیر ساختن گرید» استفاده خواهیم کرد، همان نکتهی «امکان تعویض پویای قالبهای یک دربرگیرنده» است که در مطلب «امکان تعریف قالبها در Angular با دایرکتیو ng-template» به آن پرداختیم.
تعریف قالبهای نمایش و ویرایش اطلاعات یک ردیف در گرید طراحی شده
پس از آشنایی با دایرکتیوهای تعریف و کار با قالبها در Angular، اکنون تبدیل بدنهی ثابت جدول، به دو قالب نمایش و ویرایش، سادهاست.
در قسمت دوم این سری، کار رندر بدنهی اصلی گرید توسط همین چند سطر، در قالب آن مدیریت میشود:
در ادامه قسمت داخلی ngFor را تبدیل به یک ng-container میکنیم تا قالب پذیر شود:
کار دایرکتیو ngOutletContext، تنظیم شیء context هر قالب است. به این ترتیب شیء متناظر با هر ردیف و همچنین ایندکس آنرا به هر قالب ارجاع میدهیم. خاصیت implicit$ به این معنا است که اگر منبع دادهی متغیر ورودی مشخص نشد، از مقدار item استفاده شود.
در اینجا ngTemplateOutlet این امکان را میدهد تا بتوان توسط کدهای برنامه، قالب هر ردیف را مشخص کرد. متد loadTemplate در کدهای کامپوننت متناظر فراخوانی شده و بر اساس وضعیت هر ردیف، یکی از دو قالب ذیل را بازگشت میدهد:
الف) قالب نمایش معمولی و فقط خواندنی رکوردها
همانطور که ملاحظه میکنید، در اینجا بدنهی ngFor را به یک ng-template مشخص شدهی با readOnlyTemplate# انتقال دادهایم. همچنین دو متغیر ورودی item و i را توسط -let تعریف کردهایم. چون عبارت منبع داده item مشخص نشدهاست، از همان خاصیت implicit$ شیء context استفاده میکند.
این قالب در کدهای کامپوننت آن به صورت ذیل قابل دسترسی و انتخاب شدهاست:
ب) قالب ویرایش اطلاعات هر ردیف که از آن برای افزودن یک ردیف جدید هم میتوان استفاده کرد
شبیه به همان کاری را که برای نمایش ردیفهای فقط خواندنی انجام دادیم، در مورد قالب ویرایش هر ردیف نیز تکرار میکنیم. در اینجا فقط امکان ویرایش نام محصول، قیمت آن و موجود بودن آنرا توسط یکسری input box مهیا کردهایم:
به این قالب نیز با توجه به template reference variable آن که editTemplate# نام دارد، به صورت ذیل در کامپوننت متناظر دسترسی خواهیم یافت.
تا اینجا کار تعریف قالبهای این گرید به پایان میرسد. در ادامه کدهای افزودن، ثبت، ویرایش، حذف و لغو را پیاده سازی خواهیم کرد:
خواص عمومی مورد نیاز جهت کار با قالبها و ویرایشهای درون ردیفی
برای اینکه بتوانیم قالبها را به صورت پویا تعویض کنیم، نیاز است در کدهای کامپوننت، به آنها دسترسی داشت. اینکار را توسط تعریف ViewChildهایی با همان نام template reference variable قالبها انجام دادهایم.
به علاوه اگر به قالب editTemplate دقت کنید، مقدار ویرایش شده به [(ngModel)]="selectedItem.productName" انتساب داده میشود. به همین جهت شیء selectedItem نیز تعریف شدهاست.
همچنین نیاز است بدانیم اکنون در حال ویرایش یک ردیف هستیم یا این ردیف، کاملا ردیف جدیدی است. به همین جهت پرچم isNewRecord نیز تعریف شدهاست.
فعالسازی قالب ویرایش هر ردیف
در انتهای هر ردیف، دکمهی ویرایش نیز قرار دارد که به (click) آن، رخداد editItem متصل است:
در اینجا Item انتخابی را به selectedItem انتساب میدهیم. همین مساله سبب محاسبهی مجدد ردیف میشود. یعنی متد loadTemplate داخل حلقهی ngFor مجددا فراخوانی میشود:
در اینجا بررسی میکنیم که آیا در حال ویرایش اطلاعات هستیم؟ آیا selectedItem مقدار دهی شدهاست و نال نیست؟ اگر بله، قالب editTemplate را بازگشت میدهیم. اگر خیر، قالب نمایش ردیفهای فقط خواندنی بازگشت داده میشود. به این ترتیب میتوان در کدهای برنامه به صورت پویا، در مورد نمایش قالبی خاص تصمیمگیری کرد.
مدیریت افزودن یک ردیف جدید
دکمهی افزودن یک ردیف جدید به صورت ذیل به قالب اضافه شدهاست:
بنابراین نیاز است رخداد addItem آنرا به صورت ذیل تعریف کرد:
در اینجا برخلاف حالت ویرایش که selectedItem را به item انتخابی ردیف جاری تنظیم کردیم، آنرا به یک شیء جدید و تازه تنظیم میکنیم. همچنین پرچم isNewRecord را نیز true خواهیم کرد. سپس این آیتم را به لیست رکوردهای موجود گرید نیز اضافه میکنیم. همینقدر تغییر، سبب محاسبهی مجدد loadTemplate و بارگذاری قالب ویرایشی آن میشود.
مدیریت لغو ویرایش هر ردیف
برای اینکه ویرایش هر ردیف را لغو کنیم و قالب آنرا به حالت فقط خواندنی بازگشت دهیم، فقط کافی است selectedItem را به نال تنظیم کنیم:
با این تنظیم و محاسبهی خودکار و مجدد متد loadTemplate، قسمت return this.readOnlyTemplate فعال میشود که سبب نمایش عادی یک ردیف خواهد شد.
مدیریت حذف هر ردیف
در اینجا با پیاده سازی متد رخدادگردان deleteItem و ارسال id هر ردیف به سرور، کار حذف هر ردیف را انجام خواهیم داد:
مدیریت ثبت و یا به روز رسانی هر ردیف
آخرین عملیاتی که باید مدیریت شود، بررسی پرچم isNewRecord است. اگر true بود، کار افزودن یک ردیف جدید صورت گرفته و سپس این پرچم false میشود. اگر false بود، به معنای درخواست به روز رسانی ردیفی مشخص است. در پایان هر دو عملیات selectedItem را نیز true میکنیم و این پایان عملیات باید داخل قسمت دریافت پاسخ از سرور مدیریت شود و نه پس از فراخوانی این متدها؛ چون متدهای subscribe غیرهمزمان بوده و ردیفهای پس از آنها بلافاصله اجرا میشوند.
کدهای کامل این قسمت را از اینجا میتوانید دریافت کنید.
قابلیتی که در ادامه از آن برای «قالب پذیر ساختن گرید» استفاده خواهیم کرد، همان نکتهی «امکان تعویض پویای قالبهای یک دربرگیرنده» است که در مطلب «امکان تعریف قالبها در Angular با دایرکتیو ng-template» به آن پرداختیم.
تعریف قالبهای نمایش و ویرایش اطلاعات یک ردیف در گرید طراحی شده
پس از آشنایی با دایرکتیوهای تعریف و کار با قالبها در Angular، اکنون تبدیل بدنهی ثابت جدول، به دو قالب نمایش و ویرایش، سادهاست.
در قسمت دوم این سری، کار رندر بدنهی اصلی گرید توسط همین چند سطر، در قالب آن مدیریت میشود:
<tbody> <tr *ngFor="let item of queryResult.items; let i = index"> <td class="text-center">{{ itemsPerPage * (currentPage - 1) + i + 1 }}</td> <td class="text-center">{{ item.productId }}</td> <td class="text-center">{{ item.productName }}</td> <td class="text-center">{{ item.price | number:'.0' }}</td> <td class="text-center"> <input id="item-{{ item.productId }}" type="checkbox" [checked]="item.isAvailable" disabled="disabled" /> </td> </tr> </tbody> </table>
در ادامه قسمت داخلی ngFor را تبدیل به یک ng-container میکنیم تا قالب پذیر شود:
<tbody> <tr *ngFor="let item of queryResult.items; let i = index"> <ng-container [ngTemplateOutlet]="loadTemplate(item)" [ngOutletContext]="{ $implicit: item, idx: i }"></ng-container> </tr> </tbody>
در اینجا ngTemplateOutlet این امکان را میدهد تا بتوان توسط کدهای برنامه، قالب هر ردیف را مشخص کرد. متد loadTemplate در کدهای کامپوننت متناظر فراخوانی شده و بر اساس وضعیت هر ردیف، یکی از دو قالب ذیل را بازگشت میدهد:
الف) قالب نمایش معمولی و فقط خواندنی رکوردها
<!--The Html Template for Read-Only Rows--> <ng-template #readOnlyTemplate let-item let-i="idx"> <td class="text-center">{{ itemsPerPage * (currentPage - 1) + i + 1 }}</td> <td class="text-center">{{ item.productId }}</td> <td class="text-center">{{ item.productName }}</td> <td class="text-center">{{ item.price | number:'.0' }}</td> <td class="text-center"> <input id="item-{{ item.productId }}" type="checkbox" [checked]="item.isAvailable" disabled="disabled" /> </td> <td> <input type="button" value="Edit" class="btn btn-default btn-xs" (click)="editItem(item)" /> </td> <td> <input type="button" value="Delete" (click)="deleteItem(item)" class="btn btn-danger btn-xs" /> </td> </ng-template>
این قالب در کدهای کامپوننت آن به صورت ذیل قابل دسترسی و انتخاب شدهاست:
@ViewChild("readOnlyTemplate") readOnlyTemplate: TemplateRef<any>;
ب) قالب ویرایش اطلاعات هر ردیف که از آن برای افزودن یک ردیف جدید هم میتوان استفاده کرد
شبیه به همان کاری را که برای نمایش ردیفهای فقط خواندنی انجام دادیم، در مورد قالب ویرایش هر ردیف نیز تکرار میکنیم. در اینجا فقط امکان ویرایش نام محصول، قیمت آن و موجود بودن آنرا توسط یکسری input box مهیا کردهایم:
<!--The Html Template for Editable Rows--> <ng-template #editTemplate let-item let-i="idx"> <td class="text-center">{{ itemsPerPage * (currentPage - 1) + i + 1 }}</td> <td class="text-center">{{ item.productId }}</td> <td class="text-center"> <input type="text" [(ngModel)]="selectedItem.productName" class="form-control" /> </td> <td class="text-center"> <input type="text" [(ngModel)]="selectedItem.price" class="form-control" /> </td> <td class="text-center"> <input id="item-{{ item.productId }}" type="checkbox" [checked]="item.isAvailable" [(ngModel)]="selectedItem.isAvailable" /> </td> <td> <input type="button" value="Save" (click)="saveItem()" class="btn btn-success btn-xs" /> </td> <td> <input type="button" value="Cancel" (click)="cancel()" class="btn btn-warning btn-xs" /> </td> </ng-template>
@ViewChild("editTemplate") editTemplate: TemplateRef<any>;
تا اینجا کار تعریف قالبهای این گرید به پایان میرسد. در ادامه کدهای افزودن، ثبت، ویرایش، حذف و لغو را پیاده سازی خواهیم کرد:
خواص عمومی مورد نیاز جهت کار با قالبها و ویرایشهای درون ردیفی
@ViewChild("readOnlyTemplate") readOnlyTemplate: TemplateRef<any>; @ViewChild("editTemplate") editTemplate: TemplateRef<any>; selectedItem: AppProduct; isNewRecord: boolean;
به علاوه اگر به قالب editTemplate دقت کنید، مقدار ویرایش شده به [(ngModel)]="selectedItem.productName" انتساب داده میشود. به همین جهت شیء selectedItem نیز تعریف شدهاست.
همچنین نیاز است بدانیم اکنون در حال ویرایش یک ردیف هستیم یا این ردیف، کاملا ردیف جدیدی است. به همین جهت پرچم isNewRecord نیز تعریف شدهاست.
فعالسازی قالب ویرایش هر ردیف
در انتهای هر ردیف، دکمهی ویرایش نیز قرار دارد که به (click) آن، رخداد editItem متصل است:
editItem(item: AppProduct) { this.selectedItem = item; }
loadTemplate(item: AppProduct) { if (this.selectedItem && this.selectedItem.productId === item.productId) { return this.editTemplate; } else { return this.readOnlyTemplate; } }
مدیریت افزودن یک ردیف جدید
دکمهی افزودن یک ردیف جدید به صورت ذیل به قالب اضافه شدهاست:
<div class="panel"> <input type="button" value="Add new product" class="btn btn-primary" (click)="addItem()" /> </div>
addItem() { this.selectedItem = new AppProduct(0, "", 0, false); this.isNewRecord = true; this.queryResult.items.push(this.selectedItem); this.queryResult.totalItems++; }
مدیریت لغو ویرایش هر ردیف
برای اینکه ویرایش هر ردیف را لغو کنیم و قالب آنرا به حالت فقط خواندنی بازگشت دهیم، فقط کافی است selectedItem را به نال تنظیم کنیم:
cancel() { this.selectedItem = null; }
مدیریت حذف هر ردیف
در اینجا با پیاده سازی متد رخدادگردان deleteItem و ارسال id هر ردیف به سرور، کار حذف هر ردیف را انجام خواهیم داد:
deleteItem(item: AppProduct) { this.productsService .deleteAppProduct(item.productId) .subscribe((resp: Response) => { this.getPagedProductsList(); }); }
مدیریت ثبت و یا به روز رسانی هر ردیف
آخرین عملیاتی که باید مدیریت شود، بررسی پرچم isNewRecord است. اگر true بود، کار افزودن یک ردیف جدید صورت گرفته و سپس این پرچم false میشود. اگر false بود، به معنای درخواست به روز رسانی ردیفی مشخص است. در پایان هر دو عملیات selectedItem را نیز true میکنیم و این پایان عملیات باید داخل قسمت دریافت پاسخ از سرور مدیریت شود و نه پس از فراخوانی این متدها؛ چون متدهای subscribe غیرهمزمان بوده و ردیفهای پس از آنها بلافاصله اجرا میشوند.
saveItem() { if (this.isNewRecord) { this.productsService .addAppProduct(this.selectedItem) .subscribe((resp: AppProduct) => { this.selectedItem.productId = resp.productId; this.isNewRecord = false; this.selectedItem = null; }); } else { this.productsService .updateAppProduct(this.selectedItem.productId, this.selectedItem) .subscribe((resp: AppProduct) => { this.selectedItem = null; }); } }
کدهای کامل این قسمت را از اینجا میتوانید دریافت کنید.
اشتراکها
آموزش AngularJS از کمپانی لیندا
مدت زمان فیلم یک ساعت
سرفصلهای آموزش شامل :
سرفصلهای آموزش شامل :
Introduction
Welcome
What you need to know
Using the exercise files
Using the challenges
1. Configuring a New Angular Project
Why Angular?
Downloading Angular and dependencies
Developing an application boilerplate
Starting a Node server
2. Templates
Supplying scope data
Filtering output
Controlling scopes
Including partials
Challenge: Editing airports
Solution: Editing airports
3. Application Structure
Routing views
Supplying navigation
Nesting scopes
Linking individual records
Challenge: Displaying two airports
Solution: Displaying two airports
4. Server-Side Integration
Defining services
Retrieving individual records
Searching through models
Saving form data
Challenge: Combining multiple data sources
Solution: Combining multiple data sources
Conclusion
Exploring advanced techniques
Finding Angular resources
Welcome
What you need to know
Using the exercise files
Using the challenges
1. Configuring a New Angular Project
Why Angular?
Downloading Angular and dependencies
Developing an application boilerplate
Starting a Node server
2. Templates
Supplying scope data
Filtering output
Controlling scopes
Including partials
Challenge: Editing airports
Solution: Editing airports
3. Application Structure
Routing views
Supplying navigation
Nesting scopes
Linking individual records
Challenge: Displaying two airports
Solution: Displaying two airports
4. Server-Side Integration
Defining services
Retrieving individual records
Searching through models
Saving form data
Challenge: Combining multiple data sources
Solution: Combining multiple data sources
Conclusion
Exploring advanced techniques
Finding Angular resources