سری آموزشی Blazor C# Tutorials
Blazor C# Tutorials
30 videos
In this playlist, I am going through all the fundamentals and sharing my journey to be a full stack Blazor developer. This is the future of web development in ASP.NET world. If you want to learn Blazor this is the best place to start.
1. Build Your First App - EP01
2. Getting Started - EP02
3. #Routing - EP03
4. Dependency #Injection - EP04
5. Forms & #Validations - EP05
6. JavaScript #Interop - EP06
7. #Razor #Components | Re-usability - EP07
8. Razor Components | #Lifecycle Methods - EP08
9. Razor Component #Libraries - EP09
10. Call #REST #API - #CRUD Methods - EP10
11. #Authentication | Out of the box- EP11
12. Custom AuthenticationStateProvider - EP12
13. Layouts | Login Pages - EP13
14. HttpClient | Login User
15. IHttpClientFactory | Login User
16. Sending JWT token & Request Middleware
17. Handling Exceptions
public IActionResult ConfirmOrder(Order order) { using (Serilog.Context.LogContext.PushProperty("OrderId", order.Id)) { _logger.LogInformation("Check order validation"); //DoSomething _logger.LogInformation("Order validation successfully"); //DoSomething _orderService.ConfirmOrder(order); _logger.LogInformation("Order confirmed successfully"); } return Ok(); }
{ "Timestamp":"2020-10-20T23:01:01.0492132+03:30", "Level":"Information", "MessageTemplate":"Order Confirmed successfully", "Properties":{ "SourceContext":"SerilogExamlpe.WebApplication.Controllers.WeatherForecastController", "ActionId":"870582be-312f-4065-88eb-5675e2df4928", "ActionName":"SerilogExamlpe.WebApplication.Controllers.WeatherForecastController.Get (SerilogExamlpe.WebApplication)", "RequestId":"0HM3L5QM34E6K:00000001", "RequestPath":"/weatherforecast", "SpanId":"|da92fcac-4169ab4e937de2ae.", "TraceId":"da92fcac-4169ab4e937de2ae", "ParentId":"", "OrderId":12345,//<-- NOTE THIS "MachineName":"FARHAD-PC", "Environment":"Development" } }
using (_logger.BeginScope("OrderId : {orderId}", 12345))
app.Use(async (httpContext, next) => { //Get username var username = httpContext.User.Identity.IsAuthenticated ? httpContext.User.Identity.Name : "anonymous"; LogContext.PushProperty("User", username); //Get remote IP address var ip = httpContext.Connection.RemoteIpAddress.ToString(); LogContext.PushProperty("IP", !String.IsNullOrWhiteSpace(ip) ? ip : "unknown"); await next.Invoke(); });
در ادامه مثالی را بررسی خواهیم کرد که بر اساس ردیفهای گزارش آن، یک نمودار، به انتهای گزارش اضافه خواهد شد.
کدهای کامل این مثال را در ذیل مشاهده میکنید:
using System; using System.Collections.Generic; using PdfReportSamples.Models; using PdfRpt.Core.Contracts; using PdfRpt.Core.Helper; using PdfRpt.FluentInterface; namespace PdfReportSamples.ChartImage { public class ChartImagePdfReport { public IPdfReportData CreatePdfReport() { var chart = new MSChartHelper { AxisXTitle = "User", AxisYTitle = "Balance", ChartTitle = "Users Balance", AxisTitleFont = new System.Drawing.Font("Tahoma", 12f), LabelStyleFont = new System.Drawing.Font("Tahoma", 10f), ChartTitleFont = new System.Drawing.Font("Arial", 16f, System.Drawing.FontStyle.Bold), LegendsFont = new System.Drawing.Font("Tahoma", 12f) }; return new PdfReport().DocumentPreferences(doc => { doc.RunDirection(PdfRunDirection.RightToLeft); doc.Orientation(PageOrientation.Portrait); doc.PageSize(PdfPageSize.A4); doc.DocumentMetadata(new DocumentMetadata { Author = "Vahid", Application = "PdfRpt", Keywords = "Test", Subject = "Test Rpt", Title = "Test" }); }) .DefaultFonts(fonts => { fonts.Path(string.Format("{0}\\fonts\\irsans.ttf", AppPath.ApplicationPath), string.Format("{0}\\fonts\\verdana.ttf", Environment.GetEnvironmentVariable("SystemRoot"))); }) .PagesFooter(footer => { footer.DefaultFooter(printDate: DateTime.Now.ToString("MM/dd/yyyy")); }) .PagesHeader(header => { header.DefaultHeader(defaultHeader => { defaultHeader.ImagePath(AppPath.ApplicationPath + "\\Images\\01.png"); defaultHeader.Message("گزارش جدید ما"); }); }) .MainTableTemplate(template => { template.BasicTemplate(BasicTemplate.ClassicTemplate); }) .MainTablePreferences(table => { table.ColumnsWidthsType(TableColumnWidthType.Relative); }) .MainTableDataSource(dataSource => { var listOfRows = new List<User>(); for (var i = 0; i < 7; i++) { listOfRows.Add(new User { Id = i, LastName = "نام خانوادگی " + i, Name = "نام " + i, Balance = (i * 50) + 1000 }); } dataSource.StronglyTypedList(listOfRows); }) .MainTableEvents(events => { events.DataSourceIsEmpty(message: "There is no data available to display."); events.DocumentOpened(args => { chart.ChartInit(width: (int)args.PdfWriter.PageSize.Width - 100, height: 250); }); events.RowAdded(args => { if (args.RowType == RowType.DataTableRow) { var name = args.TableRowData.GetValueOf<User>(x => x.Name); if (name == null) return; var balance = args.TableRowData.GetValueOf<User>(x => x.Balance); if (balance == null) return; chart.AddXY(name, balance); } }); events.DocumentClosing(args => { chart.AddChartToPage(args.PdfDoc); chart.FreeResources(); }); }) .MainTableSummarySettings(summary => { summary.OverallSummarySettings("جمع"); summary.PreviousPageSummarySettings("نقل از صفحه قبل"); }) .MainTableColumns(columns => { columns.AddColumn(column => { column.PropertyName("rowNo"); column.IsRowNumber(true); column.CellsHorizontalAlignment(HorizontalAlignment.Center); column.IsVisible(true); column.Order(0); column.Width(1); column.HeaderCell("ردیف", captionRotation: 90); }); columns.AddColumn(column => { column.PropertyName<User>(x => x.Id); column.CellsHorizontalAlignment(HorizontalAlignment.Center); column.IsVisible(true); column.Order(1); column.Width(2); column.HeaderCell("شماره"); }); columns.AddColumn(column => { column.PropertyName<User>(x => x.Name); column.CellsHorizontalAlignment(HorizontalAlignment.Center); column.IsVisible(true); column.Order(2); column.Width(2); column.HeaderCell("نام"); }); columns.AddColumn(column => { column.PropertyName<User>(x => x.LastName); column.CellsHorizontalAlignment(HorizontalAlignment.Center); column.IsVisible(true); column.Order(3); column.Width(3); column.HeaderCell("نام خانوادگی"); }); columns.AddColumn(column => { column.PropertyName<User>(x => x.Balance); column.HeaderCell("موجودی"); column.ColumnItemsTemplate(template => { template.TextBlock(); template.DisplayFormatFormula(obj => obj == null ? string.Empty : string.Format("{0:n0}", obj)); }); column.Width(2); column.AggregateFunction(aggregateFunction => { aggregateFunction.NumericAggregateFunction(AggregateFunction.Sum); aggregateFunction.DisplayFormatFormula(obj => obj == null ? string.Empty : string.Format("{0:n0}", obj)); }); column.CellsHorizontalAlignment(HorizontalAlignment.Center); column.IsVisible(true); column.Order(4); }); }) .Generate(data => data.AsPdfFile(AppPath.ApplicationPath + "\\Pdf\\RptChartSample.pdf")); } } }
using System.Drawing; using System.IO; //It's part of the .NET 4.0+ now. using System.Windows.Forms.DataVisualization.Charting; using iTextSharp.text; using iTextSharp.text.pdf; using PdfRpt.Core.Helper; namespace PdfReportSamples.ChartImage { public class MSChartHelper { // MS Chart learning tutorials: // http://weblogs.asp.net/scottgu/archive/2010/02/07/built-in-charting-controls-vs-2010-and-net-4-series.aspx Chart _chart; public System.Drawing.Font AxisTitleFont { set; get; } public string AxisXTitle { set; get; } public string AxisYTitle { set; get; } public string ChartTitle { set; get; } public System.Drawing.Font ChartTitleFont { set; get; } public System.Drawing.Font LabelStyleFont { set; get; } public System.Drawing.Font LegendsFont { set; get; } public void AddChartToPage(Document pdfDoc, int scalePercent = 100, float spacingBefore = 20, float spacingAfter = 10, float widthPercentage = 80) { using (var chartimage = new MemoryStream()) { _chart.SaveImage(chartimage, ChartImageFormat.Bmp); //BMP gives the best compression result var iTextSharpImage = PdfImageHelper.GetITextSharpImageFromByteArray(chartimage.GetBuffer()); iTextSharpImage.ScalePercent(scalePercent); iTextSharpImage.Alignment = Element.ALIGN_CENTER; var table = new PdfPTable(1) { WidthPercentage = widthPercentage, SpacingBefore = spacingBefore, SpacingAfter = spacingAfter }; table.AddCell(iTextSharpImage); pdfDoc.Add(table); } } public void AddXY(object xValue, params object[] yValue) { _chart.Series[0].Points.AddXY(xValue, yValue); } public void ChartInit(int width, int height) { _chart = new Chart { Width = width, Height = height, AntiAliasing = AntiAliasingStyles.All, TextAntiAliasingQuality = TextAntiAliasingQuality.High, Palette = ChartColorPalette.BrightPastel, BackColor = ColorTranslator.FromHtml("#F3DFC1"), BackGradientStyle = GradientStyle.TopBottom }; setBorder(); setTitles(); setChartAreas(); setLegends(); setSeries(); } public void FreeResources() { if (_chart != null && !_chart.IsDisposed) _chart.Dispose(); } private void setBorder() { _chart.BorderSkin.SkinStyle = BorderSkinStyle.Emboss; _chart.BorderlineWidth = 2; _chart.BorderlineColor = Color.FromArgb(181, 64, 1); _chart.BorderlineDashStyle = ChartDashStyle.Solid; } private void setChartAreas() { _chart.ChartAreas.Add("ChartArea1"); _chart.ChartAreas[0].AxisX.Title = AxisXTitle; _chart.ChartAreas[0].AxisY.Title = AxisYTitle; _chart.ChartAreas[0].AxisX.TitleFont = AxisTitleFont; _chart.ChartAreas[0].AxisY.TitleFont = AxisTitleFont; _chart.ChartAreas[0].AxisX.LabelStyle.Font = LabelStyleFont; _chart.ChartAreas[0].AxisX.LabelStyle.Angle = -90; _chart.ChartAreas[0].BackColor = Color.White; _chart.ChartAreas[0].AxisX.LineColor = Color.FromArgb(64, 64, 64); _chart.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.FromArgb(64, 64, 64); _chart.ChartAreas[0].AxisY.LineColor = Color.FromArgb(64, 64, 64); _chart.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.FromArgb(64, 64, 64); } private void setLegends() { _chart.Legends.Add("Default"); _chart.Legends[0].LegendStyle = LegendStyle.Row; _chart.Legends[0].IsTextAutoFit = false; _chart.Legends[0].DockedToChartArea = "ChartArea1"; _chart.Legends[0].Docking = Docking.Bottom; _chart.Legends[0].IsDockedInsideChartArea = false; _chart.Legends[0].BackColor = Color.Transparent; _chart.Legends[0].Font = LegendsFont; } private void setSeries() { _chart.Series.Add(""); _chart.Series[0].ChartType = SeriesChartType.Column; _chart.Series[0].Palette = ChartColorPalette.EarthTones; _chart.Series[0].IsValueShownAsLabel = true; _chart.Series[0].IsVisibleInLegend = false; } private void setTitles() { _chart.Titles.Add(ChartTitle); _chart.Titles[0].Font = ChartTitleFont; _chart.Titles[0].TextStyle = TextStyle.Shadow; _chart.Titles[0].ShadowOffset = 3; _chart.Titles[0].ShadowColor = Color.FromArgb(32, 0, 0); _chart.Titles[0].Alignment = ContentAlignment.TopCenter; _chart.Titles[0].ForeColor = Color.FromArgb(26, 59, 105); } } }
توضیحات:
- استفاده از MSChart در اینجا از این جهت مناسب است که فراگیری کار کردن با آن عمومی بوده و در پروژههای وب و ویندوز کاربرد دارد و احتمالا هم اکنون با نحوه کارکردن با آن آشنا هستید، زیرا از سال 2010 به دات نت اضافه شده است.
- در این بین تنها متد جدید و مهم کلاس MSChartHelper، متد AddChartToPage آن است. به کمک متد chart.SaveImage میتوان تصویر نهایی معادل یک نمودار را در حافظه ذخیره کرد. سپس با استفاده از متد PdfImageHelper.GetITextSharpImageFromByteArray، این تصویر موجود در حافظه را به معادل قابل استفاده آن در iTextSharp تبدیل کرده و به صفحه اضافه خواهیم کرد.
- در کدهای اصلی تولید گزارش، مقدار دهی کلاس کمکی MSChartHelper در قسمت رخدادهای قابل استفاده PdfReport در متد MainTableEvents آن انجام شده است:
در روال رویدادگردان DocumentOpened، بر اساس عرض واقعی صفحه، عرض نمودار را مشخص میکنیم:
events.DocumentOpened(args => { chart.ChartInit(width: (int)args.PdfWriter.PageSize.Width - 100, height: 250); });
events.RowAdded(args => { if (args.RowType == RowType.DataTableRow) { var name = args.TableRowData.GetValueOf<User>(x => x.Name); if (name == null) return; var balance = args.TableRowData.GetValueOf<User>(x => x.Balance); if (balance == null) return; chart.AddXY(name, balance); } });
events.DocumentClosing(args => { chart.AddChartToPage(args.PdfDoc); chart.FreeResources(); });