در حالت خاصی که در ادامه توضیح داده خواهد شد ممکن است بعضی از کنترلرها در لیست ظاهر نشوند، همانطور که در این کامنت به آن اشاره شده است.
خروجی نمایش داده شده در صفحه مربوطه به دسترسیها به صورت زیر میباشد که فقط یکی از این دو کنترلر در خروجی نمایش داده میشود:
با فرض اینکه اول کنترلر مربوط به Area One اجرا شود، مقدار آن در متغییر lastConrolerName قرار میگیرد، در اجرای بعدی foreach چون کنترلر بعدی به همان اسم میباشد از اجرا این شرط صرف نظر میکند.
و در دستور if هم به همین صورت عمل کردم :
ابتدا حالتی که باعث میشود بعضی از کنترلرهای شما در فرم مربوط به دسترسیهای پویا ظاهرا نشود را توضیح و سپس راه حلی که باعث حل آن میشود را در ادامه خواهید خواند.
دو 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)) { }
برای حل این مورد، namespace هر کنترلر را برای منحصر بفرد کردن کنترلرها دخیل کردم:
lastControllerName = $"{descriptor.ControllerTypeInfo.Namespace}{descriptor.ControllerName}";
var controllerName = $"{descriptor.ControllerTypeInfo.Namespace}{descriptor.ControllerName}"; if (!lastControllerName.Equals(controllerName, StringComparison.Ordinal))
* اگر هردو کنترلرهای Home مربوط به areaهای one,two بعد از کنترلری به اسم Home باشند، در حالت عادی هیچ کدام از این کنترلرها در خروجی ظاهرا نخواهند شد، این مورد دقیقا مشکلی بود در پروژه جاری ام با آن برخورد کردم.