[Route("~/Page/{page?}")] public ActionResult List(int page=1) {
نیازی به تعریف اکشن یا RoutePrifix نیست؟
[Route("~/Page/{page?}")] public ActionResult List(int page=1) {
namespace PdfReportSamples.Models { public class Task { public int Id { set; get; } public string Name { set; get; } public int PercentCompleted { set; get; } public bool IsActive { set; get; } public User Assignee { set; get; } } }
using System; namespace PdfReportSamples.Models { public class User { public int Id { set; get; } public string Name { set; get; } public string LastName { set; get; } public long Balance { set; get; } public DateTime RegisterDate { set; get; } } }
column.PropertyName<Task>(x => x.Assignee.Name)
using System; using System.Collections.Generic; using System.Drawing; using PdfReportSamples.Models; using PdfRpt.Core.Contracts; using PdfRpt.FluentInterface; namespace PdfReportSamples.CustomHeaderFooter { public class CustomHeaderFooterPdfReport { readonly CustomHeader _customHeader = new CustomHeader(); public IPdfReportData CreatePdfReport() { return new PdfReport().DocumentPreferences(doc => { doc.RunDirection(PdfRunDirection.LeftToRight); 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(Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\tahoma.ttf", Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\verdana.ttf"); }) .PagesFooter(footer => { footer.CustomFooter(new CustomFooter(footer.PdfFont, PdfRunDirection.LeftToRight)); }) .PagesHeader(header => { header.CustomHeader(_customHeader); }) .MainTableTemplate(template => { template.BasicTemplate(BasicTemplate.SilverTemplate); }) .MainTablePreferences(table => { table.ColumnsWidthsType(TableColumnWidthType.Relative); table.MultipleColumnsPerPage(new MultipleColumnsPerPage { ColumnsGap = 22, ColumnsPerPage = 2, ColumnsWidth = 250, IsRightToLeft = false, TopMargin = 7 }); }) .MainTableDataSource(dataSource => { var rows = new List<Task>(); var rnd = new Random(); for (int i = 1; i < 210; i++) { rows.Add(new Task { Assignee = new User { Id = i, Name = "user-" + i }, IsActive = rnd.Next(0, 2) == 1 ? true : false, Name = "task-" + i }); } dataSource.StronglyTypedList(rows); }) .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("#"); }); columns.AddColumn(column => { column.PropertyName<Task>(x => x.Name); column.CellsHorizontalAlignment(HorizontalAlignment.Center); column.IsVisible(true); column.Order(1); column.Width(3); column.HeaderCell("Task Name"); }); columns.AddColumn(column => { column.PropertyName<Task>(x => x.Assignee.Name); // nested property support column.CellsHorizontalAlignment(HorizontalAlignment.Center); column.IsVisible(true); column.Order(2); column.Width(3); column.HeaderCell("Assignee"); }); columns.AddColumn(column => { column.PropertyName<Task>(x => x.IsActive); column.CellsHorizontalAlignment(HorizontalAlignment.Center); column.IsVisible(true); column.Order(3); column.Width(2); column.HeaderCell("Active"); column.ColumnItemsTemplate(template => { template.Checkmark(checkmarkFillColor: Color.Green, crossSignFillColor: Color.DarkRed); }); }); }) .MainTableEvents(events => { events.DataSourceIsEmpty(message: "There is no data available to display."); }) .Export(export => { export.ToExcel(); }) .Generate(data => data.AsPdfFile(AppPath.ApplicationPath + "\\Pdf\\CustomHeaderFooterPdfReportSample.pdf")); } } }
using System.Collections.Generic; using iTextSharp.text; using iTextSharp.text.pdf; using PdfRpt.Core.Contracts; using PdfRpt.Core.Helper; namespace PdfReportSamples.CustomHeaderFooter { public class CustomHeader : IPageHeader { public PdfPTable RenderingGroupHeader(Document pdfDoc, PdfWriter pdfWriter, IList<CellData> rowdata, IList<SummaryCellData> summaryData) { return null; } Image _image; public PdfPTable RenderingReportHeader(Document pdfDoc, PdfWriter pdfWriter, IList<SummaryCellData> summaryData) { if (_image == null) //cache is empty { var templatePath = AppPath.ApplicationPath + "\\data\\PdfHeaderTemplate.pdf"; _image = PdfImageHelper.GetITextSharpImageFromPdfTemplate(pdfWriter, templatePath); } var table = new PdfPTable(1); var cell = new PdfPCell(_image, true) { Border = 0 }; table.AddCell(cell); return table; } } }
using System.Collections.Generic; using iTextSharp.text; using iTextSharp.text.pdf; using PdfRpt.Core.Contracts; namespace PdfReportSamples.CustomHeaderFooter { public class CustomFooter : IPageFooter { PdfContentByte _pdfContentByte; readonly IPdfFont _pdfRptFont; readonly Font _font; readonly PdfRunDirection _direction; PdfTemplate _template; public CustomFooter(IPdfFont pdfRptFont, PdfRunDirection direction) { _direction = direction; _pdfRptFont = pdfRptFont; _font = _pdfRptFont.Fonts[0]; } public void ClosingDocument(PdfWriter writer, Document document, IList<SummaryCellData> columnCellsSummaryData) { _template.BeginText(); _template.SetFontAndSize(_pdfRptFont.Fonts[0].BaseFont, 8); _template.SetTextMatrix(0, 0); _template.ShowText((writer.PageNumber - 1).ToString()); _template.EndText(); } public void PageFinished(PdfWriter writer, Document document, IList<SummaryCellData> columnCellsSummaryData) { var pageSize = document.PageSize; var text = "Page " + writer.PageNumber + " / "; var textLen = _font.BaseFont.GetWidthPoint(text, _font.Size); var center = (pageSize.Left + pageSize.Right) / 2; var align = _direction == PdfRunDirection.RightToLeft ? Element.ALIGN_RIGHT : Element.ALIGN_LEFT; ColumnText.ShowTextAligned( canvas: _pdfContentByte, alignment: align, phrase: new Phrase(text, _font), x: center, y: pageSize.GetBottom(25), rotation: 0, runDirection: (int)_direction, arabicOptions: 0); var x = _direction == PdfRunDirection.RightToLeft ? center - textLen : center + textLen; _pdfContentByte.AddTemplate(_template, x, pageSize.GetBottom(25)); } public void DocumentOpened(PdfWriter writer, IList<SummaryCellData> columnCellsSummaryData) { _pdfContentByte = writer.DirectContent; _template = _pdfContentByte.CreateTemplate(50, 50); } } }
using System.Collections.Generic; using iTextSharp.text; using iTextSharp.text.pdf; namespace PdfRpt.Core.Contracts { public interface IPageHeader { PdfPTable RenderingGroupHeader(Document pdfDoc, PdfWriter pdfWriter, IList<CellData> newGroupInfo, IList<SummaryCellData> summaryData); PdfPTable RenderingReportHeader(Document pdfDoc, PdfWriter pdfWriter, IList<SummaryCellData> summaryData); } }
using iTextSharp.text; using iTextSharp.text.pdf; using System.Collections.Generic; namespace PdfRpt.Core.Contracts { public interface IPageFooter { void DocumentOpened(PdfWriter writer, IList<SummaryCellData> columnCellsSummaryData); void PageFinished(PdfWriter writer, Document document, IList<SummaryCellData> columnCellsSummaryData); void ClosingDocument(PdfWriter writer, Document document, IList<SummaryCellData> columnCellsSummaryData); } }
readonly CustomHeader _customHeader = new CustomHeader(); //... .PagesFooter(footer => { footer.CustomFooter(new CustomFooter(footer.PdfFont, PdfRunDirection.LeftToRight)); }) .PagesHeader(header => { header.CustomHeader(_customHeader); })
در این مقاله قصد داریم اطلاعات مفیدی را در مورد طراحی دیتابیسهای چند زبانه، در اختیار شما بگذاریم. مدتی قبل به طراحی دیتابیسی که چند زبانه بودن توضیحات کالا را برای مشتریانی از کشورهای مختلف پشتیبانی میکرد، نیاز داشتم. وقتی شروع به پیاده سازی طرح دیتابیس کردم، جواب سرراست نبود. زمانیکه در وب برای بهترین راه جستجو میکردم، با نظرات و روشهای زیادی مواجه شدم. در ادامه بعضی از روشهای محبوب را بیان میکنم.
ستون اضافی : این سادهترین راه است و به ازای هر ستونی که نیاز به ترجمه داشته باشد، ستون اضافی در نظر میگیریم.CREATE TABLE app_product ( Id Int IDENTITY NOT NULL, Description_en Text, Description_pl Text, PRIMARY KEY (Id) );
مزایا :
معایب :
CREATE TABLE ref_language ( Code Char(2)NOT NULL, Name Varchar(20) NOT NULL, PRIMARY KEY (Code) ); CREATE TABLE app_translation ( Id Int IDENTITY NOT NULL, PRIMARY KEY (Id) ); CREATE TABLE app_translation_entry ( TranslationId Int NOT NULL, LanguageCode Char(2) NOT NULL, Text Text NOT NULL, FOREIGN KEY (TranslationId) REFERENCES app_translation(Id), FOREIGN KEY (LanguageCode) REFERENCES ref_language(Code) ); CREATE TABLE app_product ( Id Int IDENTITY NOT NULL, Description Int NOT NULL, PRIMARY KEY (Id), FOREIGN KEY (Description) REFERENCES app_translation(Id) );
مزایا :
معایب :
CREATE TABLE ref_language ( Code Char(2)NOT NULL, Name Varchar(20) NOT NULL, PRIMARY KEY (Code) ); CREATE TABLE app_product ( Id Int IDENTITY NOT NULL, PRIMARY KEY (Id) ); CREATE TABLE app_product_translation ( ProductId Int NOT NULL, LanguageCode Char(2) NOT NULL, Description Text NOT NULL, FOREIGN KEY (ProductId) REFERENCES app_product(Id), FOREIGN KEY (LanguageCode) REFERENCES ref_language(Code) );
مزایا :
معایب :
سه مثال نشان داده شده در بالا به ما ایده میدهند که چگونه روشهای مختلف ممکن است استفاده شوند. البته اینها همه گزینههای ممکن نیستند، فقط محبوبترین روشها هستند و شما میتوانید آنها را ویرایش کنید؛ به عنوان مثال با تعریف View های اضافی که join های پیچیده شما را در کدها، ذخیره میکنند. راه حلی که شما انتخاب میکنید به نیازمندیهای پروژه وابسته است. اگر شما به سادگی نیاز دارید و مطمئن هستید تعداد زبانهای پیشتیبانی کم و ثابت است، میتوانید راه حل اول را انتخاب کنید. اگر به انعطاف پذیری بیشتری نیاز دارید، میتوانید join های ساده در کوئریهای چند زبانه را انتخاب کنید. راه حل سوم انتخاب مناسبی است.
منبع :
http://fczaja.blogspot.com/2010/08/multilanguage-database-design.html
USE [WideWorldImporters]; GO SET STATISTICS IO ON; GO SELECT [p].[PurchaseOrderID], [pl].[PurchaseOrderLineID] FROM [Purchasing].[PurchaseOrders] [p] JOIN [Purchasing].[PurchaseOrderLines] [pl] ON [p].[PurchaseOrderID] = [pl].[PurchaseOrderID]; GO
ALTER TABLE [Purchasing].[PurchaseOrders] ADD CONSTRAINT [PK_Purchasing_PurchaseOrders] PRIMARY KEY CLUSTERED ( [PurchaseOrderID] ASC )
CREATE NONCLUSTERED INDEX [FK_Purchasing_PurchaseOrderLines_PurchaseOrderID] ON [Purchasing].[PurchaseOrderLines] ( [PurchaseOrderID] ASC )
SELECT [o].[OrderID], [ol].[OrderLineID] FROM [Sales].[Orders] [o] JOIN [Sales].[OrderLines] [ol] ON [o].[OrderID] = [ol].[OrderID]; GO
SELECT [ol].[OrderID], [ol].[OrderLineID] FROM [Sales].[Orders] [o] JOIN [Sales].[OrderLines] [ol] ON [o].[OrderID] = [ol].[OrderID];
SELECT * FROM [Sales].[Orders] [o] JOIN [Sales].[OrderLines] [ol] ON [o].[OrderID] = [ol].[OrderID]; GO
SELECT TOP 1000 * FROM [Sales].[OrderLines]; GO SELECT TOP 1000 * FROM [Sales].[OrderLines] ORDER BY [Description]; GO
SELECT [CustomerID], [OrderDate], [ExpectedDeliveryDate] FROM [Sales].[Orders] ORDER BY [CustomerID]; GO
CREATE NONCLUSTERED INDEX [IX_Sales_Orders_CustomerID_Dates] ON [Sales].[Orders]( [CustomerID] ASC ) INCLUDE ( [OrderDate], [ExpectedDeliveryDate] ) ON [USERDATA]; GO
var student=context.Students.FirstOrDefault();
var student=context.Students.LastOrDefault();
var student=context.Students.ToList().LastOrDefault();
var student=context.Students.OrderByDescending(s=>s.Id).FirstOrDefault();
public class Documents { [Key] public int Id { set; get; } [Display(Name = "تاریخ")] public string Date { set; get; } [Display(Name = "تاریخ میلادی")] public DateTime? EnDate { set; get; } [Display(Name = "روز هفته")] public string Day { set; get; } [Display(Name = "بهداشتی نقدی ")] public string BehdashtiNaghdi { set; get; } [Display(Name = "بهداشتی کارتخوان")] public string BehdashtiPose { set; get; } [Display(Name = "فیش بستری نقدی")] public string FishBastariNaghdi { set; get; } [Display(Name = "فیش بستری کارتخوان")] public string FishBastariPose { set; get; } [Display(Name = "تعداد فیش")] public string FishCount { set; get; } [Display(Name = "سرپایی نقدی")] public string SarepayiNaghdi { set; get; } [Display(Name = "سرپایی کارتخوان")] public string SarepayiPose { set; get; } [Display(Name = "تعداد نسخه")] public string Noskhecount { set; get; } [Display(Name = "صندوق شماره 1")] public string SandoghNumberOne { set; get; } [Display(Name = "صندوق شماره 2")] public string SandoghNumberTow { set; get; } [Display(Name = "تعداد فیشهای کارتخوان")] public string PoseResidCount { set; get; } [Display(Name = "نمره دکتر")] public string DoctosrRate { set; get; } [Display(Name = "توضیحات")] public string Description { set; get; } [Display(Name = "توسط کاربر")] [ForeignKey("User")] public virtual Users Users { get; set; } public int User { get; set; } [Display(Name = "پزشک شیفت")] [ForeignKey("Doctor")] public virtual Doctors Doctors { get; set; } public int Doctor { get; set; } [Display(Name = "شیفت")] [ForeignKey("Shift")] public virtual Shift ShiftsShift { get; set; } public int Shift { get; set; } [Display(Name = "نام بیمارستان")] [ForeignKey("HospitalId")] public virtual Hospitals Hospitals { get; set; } public int? HospitalId { get; set; } }