‫۱۱ سال و ۴ ماه قبل، شنبه ۴ خرداد ۱۳۹۲، ساعت ۰۰:۰۶
ممنون. میشه قسمت بررسی نهایی در اکشن متد رو هم کپسوله کرد (چیزی شبیه به امکانات AOP سرخود در MVC). مثلا یک ویژگی جدید به نام ValidateCaptcha درست کرد که به اکشن متد اعمال شود و کار بررسی صحت اطلاعات ورودی مخصوص Captcha رو انجام و نهایتا اطلاعات ModelState رو بر اساس اطلاعات ورودی و Session ایی که در اینجا تعریف شده، به روز کنه:
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
    public sealed class ValidateCaptchaAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var controllerBase = filterContext.Controller;

            var captchaInputTextProvider = controllerBase.ValueProvider.GetValue("CaptchaInputText");
            if (captchaInputTextProvider == null)
            {
                controllerBase.ViewData.ModelState.AddModelError("CaptchaInputText", "لطفا تصویر امنیتی را وارد کنید");
                base.OnActionExecuting(filterContext);
                return;
            }
            var inputText = captchaInputTextProvider.AttemptedValue;

            if (inputText != Session["captchastring"].ToString())
               controllerBase.ViewData.ModelState.AddModelError("CaptchaInputText", "تصویر امنیتی را اشتباه وارد کرده اید");
         } 
     }
به این صورت (با استفاده از ویژگی فوق) همان بررسی متداول ModelState.IsValid در یک اکشن متد کافی خواهد بود.
‫۱۱ سال و ۵ ماه قبل، چهارشنبه ۱ خرداد ۱۳۹۲، ساعت ۲۰:۵۶
پیشنیاز تئوری قسمت 12، دوره‌ای است به نام «بررسی مفاهیم معکوس سازی وابستگی‌ها و ابزارهای مرتبط با آن» در حدود 11 قسمت.
بعد از مطالعه آن، خودتان به سادگی می‌توانید این مباحث را در الگوهای مختلف پیاده سازی کنید.
یک نکته تکمیلی:
ایجاد خودکار آدرس sitemap.xml از روی آدرس کنترلر SiteMap با افزودن مسیریابی مرتبط با آن: (در حقیقت ایجاد آدرس، برای فایلی که وجود خارجی ندارد و نگاشت آن به یک کنترلر و اکشن متد خاصی در آن)
routes.MapRoute(
                "SiteMap_route", // Route name
                "sitemap.xml", // URL with parameters
                new { controller = "Sitemap", action = "index", name = UrlParameter.Optional, area = "" } // Parameter defaults
            );
‫۱۱ سال و ۵ ماه قبل، چهارشنبه ۱ خرداد ۱۳۹۲، ساعت ۱۸:۳۷
نکته: پشتیبانی توکار ASP.NET MVC از Lowercase generated URLs :
public static void RegisterRoutes(RouteCollection routes)
{
    ...
    routes.LowercaseUrls = true;
    ...
}
‫۱۱ سال و ۵ ماه قبل، سه‌شنبه ۳۱ اردیبهشت ۱۳۹۲، ساعت ۲۱:۱۷
- در متن توضیح دادم: « البته باید درنظر داشت که استفاده از پوشه Views/Shared اجباری نیست. برای مثال اگر از پوشه Views/Home/DisplayTemplates استفاده کنیم، قالب‌های سفارشی تهیه شده تنها جهت Viewهای کنترلر home قابل استفاده خواهند بود.»
در متن عنوان شده DisplayTemplates، شما این رو مثلا به EditorTemplates تغییر بدید. اصول یکی است.
- مراجعه کنید به سورس ASP.NET MVC و قسمت‌های مرتبط رو مطالعه کنید؛ جهت آشنایی بیشتر با سازوکار درونی آن‌ها.
‫۱۱ سال و ۵ ماه قبل، دوشنبه ۳۰ اردیبهشت ۱۳۹۲، ساعت ۱۸:۴۴
مشکلی مشاهده نشد. در پروژه ذیل، کلاس‌های مدل قسمت جاری به یک اسمبلی جداگانه منتقل شدند و باز هم پروژه بدون مشکل کار می‌کند:
‫۱۱ سال و ۵ ماه قبل، دوشنبه ۳۰ اردیبهشت ۱۳۹۲، ساعت ۱۶:۱۰
یک نکته مهم!
اگر روش فوق را امتحان کنید (چه استفاده از افزونه یاد شده یا حتی روش دستی مقدماتی فوق)، هر نامی را که در ابتدای کار ایجاد Solution جدید وارد کنید، به زیر پروژه‌های اضافه شده اعمال نمی‌شود. یعنی همان نام ابتدایی خودشان را خواهند داشت که این مورد اصلا جالب نیست.
برای رفع آن نیاز است از متغیری به نام $safeprojectname$ استفاده شود (هرجایی که نام پروژه به صورت مستقیم استفاده شده، حتی نام پوشه‌ها یا فایل‌ها) به همراه ReplaceParameters=true. یک مثال را در این مورد در پیوست ذیل می‌توانید دریافت کنید:
  MyConsoleApplicationTemplates.zip

روش نصب دستی این قالب با کپی کردن آن در پوشه My Documents\Visual Studio xyz\Templates\ProjectTemplates است.