‫۸ سال و ۸ ماه قبل، یکشنبه ۱۱ بهمن ۱۳۹۴، ساعت ۱۹:۱۳
سلام .
ابتدا تشکر میکنم بابت این سری از مقالات ، واقعا مفید هستند ، کیفیت کار واقعا عالی هستش ، تشکر .

برای کپسوله کردن خصوصیت‌های تکراری ، دلیل دو کلاس  Entity , BaseEntity چیست ؟ می‌شود این دو را تبدیل به یک کلاس نمود  ؟
سلام . تشکر از این مطلب مفید و کاربردی .
آیا دو کلاس زیر درست تعریف شده اند یا باید دومی به SEOSetting تبدیل شود ؟
public class GeneralSettings : SettingsBase
   {
       public string SiteName { get; set; }
       public string AdminEmail { get; set; }
       public bool RegisterUsersEnabled { get; set; }
   }
 
public class GeneralSettings : SettingsBase
   {
       public string SiteName { get; set; }
       public string AdminEmail { get; set; }
   }
‫۸ سال و ۹ ماه قبل، چهارشنبه ۲ دی ۱۳۹۴، ساعت ۱۴:۳۴
اگر thumb‌ها به درستی  نمایش داده نمی‌شود و فقط قسمتی از عکس رو مشاهده می‌کنید ، با استفاده از قطعه کد زیر این مشکل رفع خواهد شد :
1- تعریف کلاس به صورت زیر
public class ImageSize
    {
        public int Height
        {
            get;
            set;
        }

        public int Width
        {
            get;
            set;
        }
    }
2- تعریف کلاس ImageResizer همانند زیر :
public class ImageResizer
    {
        public ImageSize Resize(ImageSize originalSize, ImageSize targetSize)
        {
            var aspectRatio = (float)originalSize.Width / (float)originalSize.Height;
            var width = targetSize.Width;
            var height = targetSize.Height;

            if (originalSize.Width > targetSize.Width || originalSize.Height > targetSize.Height)
            {
                if (aspectRatio > 1)
                {
                    height = (int)(targetSize.Height / aspectRatio);
                }
                else
                {
                    width = (int)(targetSize.Width * aspectRatio);
                }
            }
            else
            {
                width = originalSize.Width;
                height = originalSize.Height;
            }

            return new ImageSize
            {
                Width = Math.Max(width, 1),
                Height = Math.Max(height, 1)
            };
        }
    }

3- تعریف کلاس ThumbnailCreator  همانند نمونه زیر :
 public class ThumbnailCreator
    {
        private static readonly IDictionary<string, ImageFormat> ImageFormats = new Dictionary<string, ImageFormat>{
            {"image/png", ImageFormat.Png},
            {"image/gif", ImageFormat.Gif},
            {"image/jpeg", ImageFormat.Jpeg}
        };

        private readonly ImageResizer resizer;

        public ThumbnailCreator()
        {
            this.resizer = new ImageResizer();
        }

        public byte[] Create(Stream source, ImageSize desiredSize, string contentType)
        {
            using (var image = Image.FromStream(source))
            {
                var originalSize = new ImageSize
                {
                    Height = image.Height,
                    Width = image.Width
                };

                var size = resizer.Resize(originalSize, desiredSize);

                using (var thumbnail = new Bitmap(size.Width, size.Height))
                {
                    ScaleImage(image, thumbnail);

                    using (var memoryStream = new MemoryStream())
                    {
                        thumbnail.Save(memoryStream, ImageFormats[contentType]);

                        return memoryStream.ToArray();
                    }
                }
            }
        }

        private void ScaleImage(Image source, Image destination)
        {
            using (var graphics = Graphics.FromImage(destination))
            {
                graphics.CompositingMode = CompositingMode.SourceCopy;
                graphics.CompositingQuality = CompositingQuality.HighQuality;
                graphics.SmoothingMode = SmoothingMode.AntiAlias;
                graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

                graphics.DrawImage(source, 0, 0, destination.Width, destination.Height);
            }
        }
    }

4- تعریف اکشن Thumbnail همانند زیر :
private FileContentResult CreateThumbnail(string physicalPath)
        {
            using (var fileStream = System.IO.File.OpenRead(physicalPath))
            {
                var desiredSize = new ImageSize
                {
                    Width = ThumbnailWidth,
                    Height = ThumbnailHeight
                };


                string contentType = MimeMapping.GetMimeMapping(physicalPath);
                return File(thumbnailCreator.Create(fileStream, desiredSize, contentType), contentType);
            }
        }

و در پایان اکشن GetThumbnail  را همانند زیر تغییر خواهیم داد :
 public virtual ActionResult GetThumbnail(string path)
        {
            path = GetSafeFileAndDirPath(path);
          //  return File(path, contentType); 
            return CreateThumbnail(path);
        }



‫۸ سال و ۱۰ ماه قبل، شنبه ۷ آذر ۱۳۹۴، ساعت ۲۱:۲۴
ممنون آقای نصیری .

آیا راه حلی هست که  قسمتی که Layout برای view تنظیم می‌شود را از caching خارج کرد ؟
خواستم از Response.WriteSubstitution  استفاده کنم و مقدار برگشتی رو در Layout قرار دهم که نمیشود به دلیل Response مستقیم در خروجی .
‫۸ سال و ۱۰ ماه قبل، شنبه ۷ آذر ۱۳۹۴، ساعت ۱۴:۴۴
سلام .
برای مواردی که Partial بر گردانده می‌شود ، نمی‌توان از خاصیت Location استفاده کرد . در این حالت کدام مورد تنظیم می‌شود (Client,Server,..) ؟
به نظر شما چرا برای متد‌های ChildAction اجازه تنظیم موراد زیر رو نمی‌دهد ؟
CacheProfile, Location, NoStore, SqlDependency, VaryByContentEncoding, VaryByHeader
‫۸ سال و ۱۰ ماه قبل، چهارشنبه ۲۷ آبان ۱۳۹۴، ساعت ۱۸:۴۷
سلام . ممنون از این سری آموزش .
صرفا جهت اطلاع:
متد addNode  نه پارامتر بیشتر نمی‌گیرد . برای افزودن تصویر به عنوان پارامتر دهم باید آن را توسعه داد و یا اینکه از ورژن جدید این کتابخانه استفاده نمایید .
آدرس جدید این کتابخانه : لینک

‫۸ سال و ۱۱ ماه قبل، یکشنبه ۳ آبان ۱۳۹۴، ساعت ۱۹:۱۳
سلام .
لطفا از تابع Table به جای GetHtml استفاده کنید و خط زیر را هم از آن حذف کنید :
 mode: WebGridPagerModes.All,

نمونه :
@{
    var grid = new WebGrid(
        source: null,
        canPage: true,
        rowsPerPage: 10,
        canSort: true,
        defaultSort: "Title"
    );
    grid.Bind(Model, rowCount: (int)ViewBag.PageCount, autoSortAndPage: false);
    var rowIndex = ((grid.PageIndex + 1) * grid.RowsPerPage) - (grid.RowsPerPage - 1);
}
@grid.Table(
            tableStyle: "table table-striped table-hover",
            headerStyle: "webgrid-header",
            footerStyle: "webgrid-footer",
            alternatingRowStyle: "webgrid-alternating-row",
            selectedRowStyle: "webgrid-selected-row",
            rowStyle: "webgrid-row-style",
            
            columns: grid.Columns(
                 grid.Column(header: "#",
                             style: "text-align-center-col",
                             format: @<text>@(rowIndex++)</text>),
                             grid.Column(columnName: "Title", header: "عنوان", style: "myfont"),
                             grid.Column(columnName: "URL", header: "آدرس", style: "myfont"),
                             
                 grid.Column(header: "",
                             style: "text-align-center-col smallcell",
                             format: item => @Html.ActionLink(linkText: "ویرایش", actionName: "Edit",
                              controllerName: "Link", routeValues: new { area = "Admin", id = item.Code },
                              htmlAttributes: new { @class = "btn-sm btn-info vertical-center" })),
                 grid.Column(header: "",
                             format: @<form action="Link/Delete/@item.Code" method="post">
                    <input type="submit" class="btn-sm btn-danger submitlink"
                           onclick="return confirm('آیا از حذف این آیتم مطمئن هستید ؟');"

                           value="حذف" />
                </form>)))
<div class="text-center">
  @grid.PagerList(mode: WebGridPagerModes.All)
</div>
اگر شما تمام دیتا را به یکباره می‌خواهید نمایش دهید باید به صورت زیر تغییر دهید :
@{
    var grid = new WebGrid(
        source: Model,
        canPage: true,
        rowsPerPage: 10,
        canSort: true,
        defaultSort: "Title"
    );
//    grid.Bind(Model, rowCount: (int)ViewBag.PageCount, autoSortAndPage: false); // Delete this Line
    var rowIndex = ((grid.PageIndex + 1) * grid.RowsPerPage) - (grid.RowsPerPage - 1);
}

‫۸ سال و ۱۱ ماه قبل، سه‌شنبه ۲۱ مهر ۱۳۹۴، ساعت ۰۳:۱۴
گرید خوب و سبکی هستش البته با کمی تغییر در نمایش آن .دو سوال داشتم
آیا امکان تنظیم تعداد کل رکورد‌ها به صورت ViewBag هست که بخواهیم متد واکشی رو به صورت ده رکورد (skip,take)بگیریم ؟ دقیقا کجا باید تعداد کل رکورد‌ها ست شود ؟
2- آیا میتوان به صفحه بندی دسترسی داشت ؟ به طور پیش فرض از تگ a استفاده میشه ، اگر بخواهیم بجای آن تگ li تولید شود چطور ؟
 تشکر
‫۸ سال و ۱۱ ماه قبل، دوشنبه ۲۰ مهر ۱۳۹۴، ساعت ۰۰:۰۵
توی پروژه ای که در حال حاضر روش کار میکنم دقیقا با این خطا رو به رو میشم و قبلا همچین مشکلی نداشتم . طبق فرمایشات شما عمل کردم ، مشکلی که هست به محض اینکه پروژه رو Run میکنم برای دیباگی چیزی با خطا Value Can not be null رو به رو میشم .
البته on browser view کردن view‌ها بدون مشکل اجرا میشوند ولی برای دیباگ کرد به مشکل بر میخورم .
توی نت هم دقیقا به پاسخ شما رسیدم ، به نظر شما چه دلیل دیگری میتونه داشته باشه ؟