‫۱۱ سال و ۲ ماه قبل، دوشنبه ۳۱ تیر ۱۳۹۲، ساعت ۱۹:۲۵
- خیر. چندین نوع استراتژی برای تعیین PK وجود دارند که یکی از آن‌ها فیلدهای Identity است و این تنها روش و الزاما بهترین روش نیست.
- مثلا زمانیکه با ORMها کار می‌کنید استفاده از فیلدهای Identity در حین ثبت تعداد بالایی از رکوردها مشکل ساز می‌شوند. چون این فیلدها تحت کنترل دیتابیس هستند و نه برنامه، ORM نیاز دارد پس از هربار Insert یکبار آخرین Id را از بانک اطلاعاتی واکشی کند. همین مساله یعنی افت سرعت در تعداد بالای Insertها (چون یکبار کوئری Insert باید ارسال شود و یکبار هم یک Select اضافی دوم برای دریافت Id تولیدی توسط دیتابیس).
- روش دوم تعیین PK استفاده از نوع Guid است. در این حالت، هم مشکل حذف رکوردها و خالی شدن یک شماره را در این بین ندارید و هم چون عموما تحت کنترل برنامه است، سرعت کار کردن با آن بالاتر است. فقط تنها مشکل آن زیبا نبودنش است در مقایسه با یک عدد ساده فیلدهای Identity.

در مورد فیلدهای Identity، تغییر شماره Id به صلاح نیست چون:
الف) همانطور که عنوان کردید روابط بین جداول را به هم خواهد ریخت.
ب) در یک وب سایت و یا هر برنامه‌ای، کلا آدرس‌ها و ارجاعات قدیمی را از بین می‌برد. مثلا فرض کنید شماره این مطلب 1381 است و شما آن‌را یادداشت کرده‌اید. در روزی بعد، برنامه نویس شماره Id‌ها را کلا ریست کرده. در نتیجه یک هفته بعد شما به شماره 1381 ایی خواهید رسید که تطابقی با مطلب مدنظر شما ندارد (حالا فرض کنید که این عدد شماره پرونده یک شخص بوده یا شماره کاربری او و نتایج و خسارات حاصل را درنظر بگیرید).
ج) این خوب است که در بین اطلاعات یک ردیف خالی وجود دارد. چون بر این اساس می‌توان بررسی کرد که آیا واقعا رکوردی حذف شده یا خیر. گاهی از اوقات کاربران ادعا می‌کنند که اطلاعات ارسالی آن‌ها نیست در حالیکه نبود این رکوردها به دلیل حذف بوده و نه عدم ثبت آن‌ها. با بررسی این Id‌ها می‌شود با کاربران در این مورد بحث کرد و پاسخ مناسبی را ارائه داد.

و اگر شماره‌ای که به کاربر نمایش می‌دهید فقط یک شماره ردیف است (و از این لحاظ می‌خواهید که حتما پشت سرهم باشد)، بهتر است یک View جدید ایجاد کنید تا این Id خود افزاینده را تولید کند (بدون استفاده از pk جدول).


پ.ن.
هدف من از این توضیحات صرفا عنوان این بود که به PK به شکل یک فیلد read only نگاه کنید. این دقیقا برخوردی است که Entity framework با این مفهوم دارد و صحیح است و اصولی. اگر در یک کشور هر روزه عده‌ای به رحمت ایزدی می‌روند به این معنا نیست که سازمان ثبت احوال باید شماره شناسنامه‌ها را هر ماه ریست کند!

‫۱۱ سال و ۳ ماه قبل، دوشنبه ۳۱ تیر ۱۳۹۲، ساعت ۱۴:۰۶
در مثالی که من در این قسمت مطرح کردم، نام کنترل ارسال فایل photo است، اما نام پارامتر اکشن متد متناظر با آن file قرار داده شده که باید یکی شوند. به این ترتیب model binder اینبار می‌داند که اطلاعات دریافتی را باید به چه پارامتری انتساب دهد تا مقدار آن دیگر نال نباشد.
‫۱۱ سال و ۳ ماه قبل، دوشنبه ۳۱ تیر ۱۳۹۲، ساعت ۱۳:۳۸
حجم مطالب و فایل‌ها و تصاویر بالا رفته، رم سرور جاری اجازه تولید این فایل حجیم PDF رو نمی‌ده. اما خروجی کلی تمام گروه‌ها به تفکیک موجود است.
این خروجی هم صرفا برای کاربران فعال سایت درنظر گرفته شده است. کاربری در این سایت فعال نامیده می‌شود که حداقل یک مطلب جدید یا حداقل یک اشتراک جدید را ارسال کرده باشد.


پ.ن.
لطفا سعی نکنید برای رسیدن به این حد نصاب هر مطلب پیش پا افتاده یا هر لینک به سایت‌های آشپزی که مطالب به نظر علمی را هم منتشر می‌کنند، ارسال کنید چون منجر به حذف اکانت شما خواهد شد.

‫۱۱ سال و ۳ ماه قبل، یکشنبه ۳۰ تیر ۱۳۹۲، ساعت ۰۰:۱۱
امکان دیباگ کارهای شخصی، به همراه سفارشی سازی‌های خاص آن‌ها و قسمت‌های متعدد تاثیرگذار بر یکدیگر در آن‌ها، از راه دور وجود ندارد.
‫۱۱ سال و ۳ ماه قبل، شنبه ۲۹ تیر ۱۳۹۲، ساعت ۲۳:۲۹
- ویژگی‌ها یا Attributes در دات نت، استاتیک متادیتا هستند؛ مانند تعداد پارامترها، نام متدها و امثال آن که به صورت کامپایل شده در فایل باینری نهایی قرار می‌گیرند و نهایتا از طریق Reflection قابل دسترسی خواهند بود. تغییر آن‌ها یا افزودن آن‌ها عموما از طریق دستکاری کدهای IL میسر است یا از روش‌های IL Code weaving مباحث AOP یا روش‌هایی مانند Reflection.Emit و همانند آن. 
- یک استثناء در اینجا وجود دارد و آن هم متد TypeDescriptor.AddAttributes است که در زمان اجرا کار می‌کند. استفاده از آن هم فقط زمانی جواب خواهد داد که فریم ورک پایه از متد  TypeDescriptor.GetAttributes برای یافتن ویژگی‌ها استفاده کرده باشد.
‫۱۱ سال و ۳ ماه قبل، جمعه ۲۸ تیر ۱۳۹۲، ساعت ۰۴:۵۸
این مورد بستگی به طراحی و آنالیز برنامه دارد. در جایی مانند صفحه تنظیمات SMTP Server برنامه، سطح دسترسی، فقط مدیریتی است و پویایی آن معنایی ندارد. در جای دیگری قرار است مطالبی ارسال شوند، اینجا دسترسی به دو نقش ادیتور و ادمین که شامل عده‌ای خواهند بود مفهوم دارد.
اما اگر سایتی پویا طراحی شده و از روز اول طرح دقیقی ندارد، مثلا در آن صفحات مختلفی به صورت پویا اضافه می‌شوند و قرار است به هر صفحه‌ای نقش(های) خاصی انتساب داده شوند که از روز اول پیش بینی و طراحی نشده، فقط کافی است همین فیلتر AuthorizeAttribute را با ارث بری از آن سفارشی سازی کرد تا بر اساس آدرس صفحه جاری (filterContext.HttpContext.Request.Url)، نقش‌های انتساب داده شده را از بانک اطلاعاتی بخواند و تصمیم گیری کند که آیا کاربر لاگین شده به سیستم (filterContext.HttpContext.User) می‌تواند به این صفحه دسترسی داشته باشد یا خیر و هدایتش کند (filterContext.HttpContext.Response.Redirect) به صفحه لاگین برنامه (FormsAuthentication.LoginUrl). یا حتی در اینجا بر اساس نام کنترلر و اکشن متد جاری هم می‌توان تصمیم گیری کرد:
filterContext.ActionDescriptor.ControllerDescriptor.ControllerName
filterContext.ActionDescriptor.ActionName
‫۱۱ سال و ۳ ماه قبل، جمعه ۲۸ تیر ۱۳۹۲، ساعت ۰۰:۵۱
HTTP Module استاندارد ASP.NET است و بر روی کل سایت تاثیر دارد. روش فعال سازی آن در وب فرم‌ها یا MVC تفاوتی نمی‌کند و یکی است.
مراجعه کنید به سایت اصلی سازنده آن، مثال به همراه وب کانفیگ تنظیم شده دارد؛ یا پروژه IRIS هم از این ماژول استفاده می‌کند.
‫۱۱ سال و ۳ ماه قبل، جمعه ۲۸ تیر ۱۳۹۲، ساعت ۰۰:۲۸
در متد processAjaxForm در قسمت options.errorHandler آن چون dialogContent مجددا مقدار دهی می‌شود، نیاز است سیم کشی‌های آن مجددا برقرار شوند، شامل مباحث اعتبارسنجی و همچنین تحت کنترل قرار دادن دکمه submit آن. یعنی به صورت زیر
                        } else {
                            $('#dialogContent').html(result);

                            $.validator.unobtrusive.parse("#dialogContent");
                            enablePostbackValidation();
                            processAjaxForm('#dialogContent');

                            if (options.errorHandler)
                                options.errorHandler();
                        }