‫۸ سال و ۸ ماه قبل، جمعه ۱۶ بهمن ۱۳۹۴، ساعت ۱۷:۲۷
یک نکته‌ی تکمیلی
تعیین شماره نگارش IE مورد استفاده‌ی توسط برنامه به صورت خودکار:
using System;
using System.Diagnostics;
using Microsoft.Win32;
using System.Windows.Forms;

namespace Core
{
    public static class UseLatestVersionOfIE
    {
        /// <summary>
        /// Use the latest version of IE in WebBrowser control
        /// </summary>
        public static void SetWebBrowserVersion()
        {
            RegistryKey regkey = null;
            try
            {
                regkey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", writable: true);
                if (regkey == null)
                {
                    return;
                }

                var regVal = getInstalledIEVersion();
                var appName = string.Format("{0}.exe", Process.GetCurrentProcess().ProcessName);
                regkey.SetValue(appName, regVal, RegistryValueKind.DWord);
            }
            catch (Exception ex)
            {
              // todo: log ...
            }
            finally
            {
                if (regkey != null)
                {
                    regkey.Close();
                }
            }
        }

        private static int getInstalledIEVersion()
        {
            int browserVer;
            using (var wb = new WebBrowser())
            {
                browserVer = wb.Version.Major;
            }

            int regVal;
            if (browserVer >= 11)
                regVal = 11001;
            else
                switch (browserVer)
                {
                    case 10:
                        regVal = 10001;
                        break;
                    case 9:
                        regVal = 9999;
                        break;
                    case 8:
                        regVal = 8888;
                        break;
                    default:
                        regVal = 7000;
                        break;
                }
            return regVal;
        }
    }
}
در اینجا شماره نگارش IE از کنترل WebBrowser دریافت می‌شود و همیشه به آخرین نگارش تنظیم خواهد شد و همچنین چون از Registry.CurrentUser استفاده می‌کند، نیازی به دسترسی مدیریتی برای اعمال ندارد.
‫۸ سال و ۸ ماه قبل، چهارشنبه ۱۴ بهمن ۱۳۹۴، ساعت ۱۵:۵۰
Guid از نوع IConvertible نیست. به همین جهت باید به این صورت عمل کنید:
Guid.Parse(User.Identity.GetUserId())
و یا
public static class IdentityExtensions
{
    public static Guid GetGuidUserId(this IIdentity identity)
    {
        Guid result = Guid.Empty;
        Guid.TryParse(identity.GetUserId(), out result);
        return result;
    }   
}
‫۸ سال و ۸ ماه قبل، یکشنبه ۴ بهمن ۱۳۹۴، ساعت ۱۵:۵۳
«a task was canceled» صرفا مرتبط هست به زنده نگه داشتن app pool برنامه؛ در زمانیکه سایت بازدید کننده‌ای ندارد. نظرات بحث را از ابتدا دنبال کنید؛ در مورد سرویس ping و امثال آن بحث شده.
‫۸ سال و ۸ ماه قبل، جمعه ۲ بهمن ۱۳۹۴، ساعت ۲۳:۲۳
یک نکته
اگر مثال زیر را برای تبدیل تاریخ شمسی 1393/02/31 یا 1393/04/31، به کمک متد DateTime.ParseExact اجرا کنید، با استثنایی متوقف خواهید شد:
var persianCulture = new CultureInfo("fa-IR");
var persianDateTime = DateTime.ParseExact("31/02/1393", "dd/MM/yyyy", persianCulture);
علت اینجا است که persianCulture.Calendar به GregorianCalendar تنظیم شده‌است (از ابتدا و به اشتباه) و قابل تغییر نیست (مگر با Reflection). راه حل جایگزین، چیزی شبیه به این خواهد بود:
   using System;
   using System.Globalization;
   using System.Linq;

    public static DateTime PersianDateToGregorianDate(string pDate)
    {
        var dateParts = pDate.Split(new[] { '/' }).Select(d => int.Parse(d)).ToArray();
        var hour = 0;
        var min = 0;
        var seconds = 0;
        return new DateTime(dateParts[0], dateParts[1], dateParts[2],
                            hour, min, seconds, new PersianCalendar());
    }
‫۸ سال و ۸ ماه قبل، یکشنبه ۲۷ دی ۱۳۹۴، ساعت ۰۰:۲۹
برای عمومی‌تر کردن پیاده سازی ICommand یک چنین کلاسی را می‌توان تدارک دید:
using System;
using System.Windows.Input;

namespace Common.Mvvm
{
    public class DelegateCommand<T> : ICommand
    {
        readonly Func<T, bool> _canExecute;
        readonly Action<T> _executeAction;

        public DelegateCommand(Action<T> executeAction, Func<T, bool> canExecute = null)
        {
            if (executeAction == null)
                throw new ArgumentNullException("executeAction");

            _executeAction = executeAction;
            _canExecute = canExecute;
        }

        public event EventHandler CanExecuteChanged
        {
            add { if (_canExecute != null) CommandManager.RequerySuggested += value; }
            remove { if (_canExecute != null) CommandManager.RequerySuggested -= value; }
        }

        public bool CanExecute(object parameter)
        {
            return _canExecute == null || _canExecute((T)parameter);
        }

        public void Execute(object parameter)
        {
            _executeAction((T)parameter);
        }
    }
}
و بعد برای استفاده‌ی از آن، به صورت یک خاصیت عمومی در سطح ViewModel تعریف می‌شود:
public DelegateCommand<object> DoCopyAllLines { set; get; }
سپس وهله سازی آن در سازنده‌ی کلاس:
DoCopyAllLines = new DelegateCommand<object>(CopyAllLines, info => true);
و بعد برای پیاده سازی متد execute آن:
private void CopyAllLines(object data)
{
   // ...
}
‫۸ سال و ۸ ماه قبل، سه‌شنبه ۲۲ دی ۱۳۹۴، ساعت ۱۹:۵۲
کتابخانه‌ی « HtmlSanitizer » نیز برای تمیزسازی HTML دریافتی، با توجه به آزمون‌های واحدی که دارد، بسیار مناسب است. همچنین مطلب «افزودن هدرهای Content Security Policy به برنامه‌های ASP.NET» را هم مدنظر داشته باشید.  
‫۸ سال و ۸ ماه قبل، یکشنبه ۲۰ دی ۱۳۹۴، ساعت ۲۰:۴۱
- در کل در حالت POST به سرور، هر فیلدی که در فرم وجود داشته باشد (چه مخفی یا خیر) اطلاعات آن به سمت سرور ارسال می‌شود. 
- اطلاعات View State هم در وب فرم‌ها با هر post back به سمت سرور ارسال می‌شود (یک فیلد مخفی در فرم صفحه است و با هر POST ایی به سمت سرور ارسال می‌شود).
- در MVC اگر return model داشته باشید؛ بله. در غیر اینصورت اطلاعاتی به سمت کلاینت ارسال نمی‌شود.
‫۸ سال و ۹ ماه قبل، شنبه ۱۹ دی ۱۳۹۴، ساعت ۱۵:۰۵
به jQuery 2.2 پشتیبانی از Symbolها اضافه شده‌است. به این معنا که اکنون می‌توان از حلقه‌های for of بر روی المان‌های آن استفاده کرد:
for (element of $elements) {
   console.log(element);
}