‫۲ سال و ۹ ماه قبل، پنجشنبه ۲۰ آبان ۱۴۰۰، ساعت ۰۱:۰۳
بله درسته، مشکلی که در بالا بیان کردم فقط زمانی اتفاق می‌افتد که کنترلرهای هم نام که از طریق زیر گرفته می‌شوند، بعد از هم قرار داشته باشند:
 actionDescriptorCollectionProvider.ActionDescriptors.Items
دو کنترلر هم نام ( ^  و  ^ )   طبق تصویر زیر چون بعد از هم قرار نگرفته اند، مشکلی ندارند:  


اگر مقدار actionDescriptorCollectionProvider.ActionDescriptors.Items  قبل از ورود به حلقه foreach بر اساس نام کنترلر مرتب شود( که کنترلرهای هم نام پشت سرهم  قرار گیرند) خروجی فوق را مشاهده نخواهید کرد. 

‫۲ سال و ۹ ماه قبل، چهارشنبه ۱۹ آبان ۱۴۰۰، ساعت ۲۱:۱۰
در حالت خاصی که در ادامه توضیح داده خواهد شد ممکن است بعضی از کنترلرها در لیست ظاهر نشوند، همانطور که در این کامنت به آن اشاره شده است.
ابتدا حالتی که باعث می‌شود بعضی از کنترلرهای شما در فرم مربوط به دسترسی‌های پویا ظاهرا نشود را توضیح و سپس راه حلی که باعث حل آن می‌شود را در ادامه خواهید خواند.
دو Area جدید به اسم‌های One , Two اضافه شدند که هر کدام شامل یک کنترلر به اسم Home  هستند (داخل هر کنترلر هم یک اکشن متد به نام Index وجود دارد )
    [Authorize(Policy = ConstantPolicies.DynamicPermission)]
    [Area("One")]
    [DisplayName("home")]
    public class HomeController : Controller
    {
        [DisplayName("ایندکس")]
        public IActionResult Index()
        {
            return View();
        }
    }

و مشابه همین برای Area دوم :
[Authorize(Policy = ConstantPolicies.DynamicPermission)]
    [Area("Two")]
    [DisplayName("home2")]
    public class HomeController : Controller
    {
        [DisplayName("ایندکس")]
        public IActionResult Index()
        {
            return View();
        }
    }
خروجی نمایش داده شده در صفحه مربوطه به دسترسی‌ها به صورت زیر می‌باشد که فقط یکی از این دو کنترلر در خروجی نمایش داده می‌شود:


بعد از بررسی کدهای مربوط به GetAllSecuredControllerActionsWithPolicy  متوجه شدم زمانی که دو کنترلر هم نام پشت سر هم قرار گرفته باشند،  کنترلر دوم بخاطر شرط زیر نادیده گرفته می‌شود:
 if (!lastControllerName.Equals(descriptor.ControllerName, StringComparison.Ordinal))
{
}
با فرض اینکه اول کنترلر مربوط به Area One اجرا شود، مقدار آن در متغییر lastConrolerName قرار میگیرد، در اجرای بعدی foreach چون کنترلر بعدی به همان اسم می‌باشد از اجرا این شرط صرف نظر میکند.
برای حل این مورد، namespace هر  کنترلر را برای منحصر بفرد کردن کنترلرها دخیل کردم:
   lastControllerName = $"{descriptor.ControllerTypeInfo.Namespace}{descriptor.ControllerName}";
و در دستور if هم به همین صورت عمل کردم :
       var controllerName = $"{descriptor.ControllerTypeInfo.Namespace}{descriptor.ControllerName}";
        if (!lastControllerName.Equals(controllerName, StringComparison.Ordinal))

* اگر هردو کنترلر‌های Home مربوط به area‌های one,two بعد از کنترلری به اسم Home باشند، در حالت عادی هیچ کدام از این کنترلرها در خروجی ظاهرا نخواهند شد، این مورد دقیقا مشکلی بود در پروژه جاری ام با آن برخورد کردم.
‫۳ سال و ۶ ماه قبل، شنبه ۱۶ اسفند ۱۳۹۹، ساعت ۱۳:۱۱
بله حرف شما درسته.
هیچ مقاله ای توصیه نکرده این امکان جایگزین SingleQuery بشه، خود برنامه نویس با توجه به شناختی که از سیستم داره باید تصمیم بگیره چه زمانی از این امکان استفاده بشه.

‫۶ سال و ۴ ماه قبل، دوشنبه ۲۴ اردیبهشت ۱۳۹۷، ساعت ۰۴:۳۸
در اکثر موراد مطرح شده فوق ، فایل‌های آپلود شده وابسته بوند به یک رکورد که ابتدا می‌بایست رکورد مورد نظر درج تا بتوان فایل را با آن کلید آپلود و ذخیره نمود .
ولی در توضیح آقای ربال ، فرض کنید همین ادیتور سایت فعلی ، شما قصد نوشتن یک مقاله را دارید و لابه لای متون نیاز به قراردادن عکس هم دارید ، در این حالت سایت فعلی عکس مورد نظر ذخیره نموده و فقط آدرس آن برگشت داده میشود و داخل تگ src قرار داده می‌شود تا فایل نمایش داده شود . در این حالت فقط مشخص می‌شود که کاربر x فایل y  را آپلود کرده است .
‫۶ سال و ۶ ماه قبل، سه‌شنبه ۸ اسفند ۱۳۹۶، ساعت ۱۸:۳۰
خوب شما یک بار اکشن مربوطه را دیباگ کنید و ببینید چه خطایی میدهد چون طبق چیزی که نوشته ای خطا از کلاینت شما نیست .فعلا جهت تست هم که شده یک try...catch اضافه کنید 
مشکل از این بود که در متد لاگین RefreshToken ساخته نمی‌شد .
برای رفع آن در متد isAuthUserLoggedIn، خط * به صورت زیر تغییر دادم.
//const hasTokens = !this.isEmptyString(accessToken) && !this.isEmptyString(refreshToken); *
    const hasTokens = !this.isEmptyString(accessToken);
و در سازنده کلاس و بعد از لاگین خط زیر رو کامنت کردم.
this.scheduleRefreshToken();
تشکر
بنده طبق روش‌های فوق پیش رفتم. فقط بعد از لاگین، وقتی کاربر صفحه را دستی رفرش کند، هدر اصلا نمایش داده نمی‌شود؛ ولی درخواست‌ها سمت سرور Authenticate هستند و مقدار isLoggedIn  برابر false است. البته مقادیر Token ,Remember me در Local storage موجود  می‌باشند.
ممنون میشوم راهنمایی بفرمایید .
‫۷ سال و ۱ ماه قبل، پنجشنبه ۱۹ مرداد ۱۳۹۶، ساعت ۱۵:۱۰
صرفا جهت اطلاع خودم سوالی داشتم ، در این حالت با استفاده از command‌های در دسترس مثل ng serve -o قادر به اجرای پروژه هستیم . اگر بعد از اتمام پروژه قصد داشته باشیم فایل index.html را مستقیم open in browser بزنیم ، در این حالت باید به صورت دستی کتابخانه‌های و تنظیمات ابتدایی همانند قسمت اول درج شود ؟
‫۷ سال و ۳ ماه قبل، دوشنبه ۲۲ خرداد ۱۳۹۶، ساعت ۱۹:۳۹
با تشکر  ، ایده‌ی خوبی است . بنده خودم برای موارد این چنینی متد چک کردن را داخل متد اصلی (سرویس) قرار می‌دهم برای نمونه مثال شما رو به صورت :
Public editStatus Edit(int id){
if (IsPassed(id)) return youCantEditThisDoc;
// do edit
}
بنده خودم این روش را ترجیح میدهم به این دلیل که شاید برنامه نویسی که قصد پیاده سازی لایه UI را دارد شاید از این نحوه کارکرد اطلاع نداشته باشد و تا حدودی متد‌ها کپسوله میشود .
‫۷ سال و ۴ ماه قبل، دوشنبه ۲۵ اردیبهشت ۱۳۹۶، ساعت ۲۲:۱۵
در قسمت قبل عنوان شد که  کار *ngIf نمایش و یا عدم نمایش قسمتی از DOM است . آیا رویداد toggleImage  سبب بازخوانی مجدد کل کامپوننت می‌شود و یا فقط بخش ngFor مجددا اجرا می‌شود؟ چون در ابتدا بر اساس ngIf برای showImage هیچ عکسی رندر نمی‌شودو هیچ عکسی وجود ندارد.