نظرات مطالب
استفاده از نگارش سوم Google Analytics API در سرویس‌های ویندوز یا برنامه‌های وب
سلام و تشکر از مقاله خوبتان.
به نظر شما بهتر است که یک اکانت در آنالیتیکس تعریف کنیم و تمام وبسایت‌های خودمان را به این اکانت اضافه کنیم  یا اینکه برای هر وبسایت یک اکانت مجزا بسازیم؟
نظرات مطالب
ASP.NET MVC #12
با سلام و تشکر
چیزی که الان یاد گرفتم اینه که می‌توان متادیتا را در یک کلاس جدا کرد و سپس آنرا به مدل اعمال کرد، آیا این امکان وجود داره که در runtime به مدل مورد نظر کلاس metadata اضافه شود؟  
نظرات مطالب
خواندنی‌های 29 تیر
سلام،
من فارغ التحصیل رشته نرم افزار هستم و اخیرا به جمع خوانندگان بلاگ شما اضافه شدم.
برای مطالب فوق العاده مفید و خواندنی شما کمال تشکر را دارم.

نوید.
بازخوردهای پروژه‌ها
آموزش WPF
سلام و خسته نباشید با توجه به توسعه نرم افزارهای تحت ویندوز توسط WPF از شما خواهشمندم مطالبی را در زمینه آموزش آن به سایت اضافه نمایید. با تشکر
بازخوردهای پروژه‌ها
کلمه عبور ورود به برنامه
با سلام و احترام
خواهشمند است کلمه عبور برای ورود به سیستم را در بخش راهنمایی‌های پروژه اضافه کنید.

با تشکر
مطالب
نحوه تولید پویای صفحات از طریق دیتابیس در ASP.NET MVC
گاهی نیاز داریم صفحات را در دیتابیس ذخیره کنیم تا علاوه بر قابلیت جستجوی پیشرفته‌ی صفحات از طریق Full Text Search، بتوانیم از پویایی صفحات کامپایل شونده نیز استفاده کنیم.
جهت پیاده سازی این مثال ما از Entity Framework استفاده می‌کنیم.
بنابراین ابتدا کلاس Page را جهت ذخیره آدرس و محتوی صفحات مجازی در دیتابیس، پیاده سازی می‌کنیم: 
public class Page
{
    public int Id { get; set; }

    public string Path { get; set; }

    public string Content { get; set; }
}  
سپس کلاس VirtualPathProvider را سفارشی سازی می‌کنیم:
public class CustomVirtualPathProvider : VirtualPathProvider
{
    public override bool FileExists(string virtualPath)
    {
        return base.FileExists(virtualPath) || FileExistsInDatabase(virtualPath);
    }

    public override VirtualFile GetFile(string virtualPath)
    {
        return base.FileExists(virtualPath)
            ? base.GetFile(virtualPath)
            : new CustomVirtualFile(virtualPath, GetFileFromDatabase(virtualPath));
    }

    private bool FileExistsInDatabase(string virtualPath)
    {
        virtualPath = virtualPath.Replace("~", "");

        return new DatabaseContext().Pages.Any(v => v.Path == virtualPath);
    }

    private byte[] GetFileFromDatabase(string virtualPath)
    {
         virtualPath = virtualPath.Replace("~", "");

         return Encoding.UTF8.GetBytes(new DatabaseContext().Pages.First(v => v.Path == virtualPath).Content);
    }
}  
تابع FileExists ابتدا وجود فایل مورد نظر را در مسیر داده شده، بررسی می‌کند و در صورت عدم وجود آن، دیتابیس را به دنبال آن جستجو می‌کند.
تابع GetFile در صورتیکه صفحه به صورت فایل موجود باشد، روال همیشگی را جهت نمایش طی می‌کند. اما اگر نباشد یک نمونه از کلاس سفارشی سازی شده‌ی CustomVirtualFile را ایجاد کرده و بر می‌گرداند.
کلاس CustomVirtualFile به صورت زیر سفارشی سازی شده:
public class CustomVirtualFile : VirtualFile
{
    private readonly byte[] _content;

    public CustomVirtualFile(string virtualPath, byte[] content)
        : base(virtualPath)
    {
        _content = content;
    }

    public override Stream Open()
    {
        return new MemoryStream(_content);
    }
}  
تابع Open، محتوای ارائه شده را به صورت یک استریم بر می‌گرداند.

حال نوبت ثبت کلاس CustomVirtualPathProvider جهت استفاده‌ی خودکار از آن می‌باشد. برای این کار در تابع Application_Start موجود در فایل Global.asax.cs دستور زیر را اضافه می‌نماییم:
protected void Application_Start()
{
    HostingEnvironment.RegisterVirtualPathProvider(new CustomVirtualPathProvider());
    //...
}
و تمام!
همه چیز به صورت خودکار اجرا شده و در صورت عدم وجود فایل در آدرس‌های ارسال شده، صفحات ما از طریق جدول Pages موجود در دیتابیس بارگزاری می‌شوند.