PDA

View Full Version : طراحی منوی پویا



alireza_rashvand
سه شنبه 26 خرداد 1394, 03:37 صبح
با سلام

اگر بخواهیم همچین منو ای (http://jsfiddle.net/luismruiz/YRVev/) رو به صورت داینامیک با گرفتن اطلاعات از دیتابیس ایجاد کنیم دوستان چه پیشنهادی می دند؟

تیتر منو در یک جدول و زیر منو در جدول دیگری ثبت شده اند

niloo17
سه شنبه 26 خرداد 1394, 08:56 صبح
با استفاده از یک PartialView ، لیست آیتم های منو و زیر منو را به عنوان Model برای آن می فرستیم.
با یک حلقه منو ها را می سازیم.

salar IT man
سه شنبه 26 خرداد 1394, 10:45 صبح
با سلام

اگر بخواهیم همچین منو ای (http://jsfiddle.net/luismruiz/YRVev/) رو به صورت داینامیک با گرفتن اطلاعات از دیتابیس ایجاد کنیم دوستان چه پیشنهادی می دند؟

تیتر منو در یک جدول و زیر منو در جدول دیگری ثبت شده اند

-با یک جدول هم میتونید همین کار را انجام دهید!

به قول دوستمون یه foreach و ... کارا حل میشه! کدوم قسمت مشکل دارید بفرمایید

alireza_rashvand
چهارشنبه 27 خرداد 1394, 05:13 صبح
-با یک جدول هم میتونید همین کار را انجام دهید!

به قول دوستمون یه foreach و ... کارا حل میشه! کدوم قسمت مشکل دارید بفرمایید

سپاس از وقتی که بنده میدید.

فکر کنم با یک جدول خود ارجاع دهنده بشه این کار رو کرد ولی همان طور که خبر (http://barnamenevis.org/showthread.php?495765-%D8%B3%D8%B7%D8%AD-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D9%BE%D9%88%DB%8C%D8%A7)دارید روی سطح دستری کار می کنم
می خواهم برای هر کاربر براساس سطح دستری هایی که داره منو ایجاد کنم

تا اینجا چند جدول ایجاد کردم
1- جدول دسته بندی هاي منو Menu
2- جدول Permissions که کد جدول بالا رو توش داره (MenuId)
3- جدول واسط RolePermission که مجوز های رول ها را مشخص می کنه (شامل : RoleId,PermissionId)

جدول Permissions با هر دو جدول در ارتباطه

در مجوز ها نام کنترلر و نام اکش رو ذخیره می کنم تا بتونم لینک را بسازم
ترجیه دادم با جدول رول ارتباط بر قرار نکنم و با جستجو رول هر کار بر رو بدست بیارم.

با این کد تونستم تمام اطلاعات سه جدول رو با هم join کنم



var UserPer = db.Permissions
.Select(x => new ViewUserMenu
{
Name = x.Name,
ActionName = x.ActionName,
ControllerName = x.ControllerName,
RoleId = x.RolePermission.Select(Y => Y.RoleId).FirstOrDefault(),
MenuName = x.Menu.Name,
MenuId = x.Menu.CategoryID,
}).ToList();




سوال كه زیاد برام پیش اومده ولی اولین سوالم اینه
ایا می شه کد رو به صورتی نوشت که رول های (RoleId) کاربر رو فیلتر کنه؟
(کد رول های کاربر رو هم قبلتر بدست اوردم و همان طور که می دونید ممکنه هر کاربر چند رول داشته باشه)

دقیقتر بخوام بگم یعنی اینکه کد بالا تمام مجوزهای موجود رو میاره و من می خواهم مجوزهایی رو داشته باشم که شامل رول های کاربر مورد نظر می شه
(بدست اوردن تمام مجوزهای کاربر).


اگه سوالم دقیق مشخص نیست بگید بهتر توضیح بدم
سپاس

salar IT man
چهارشنبه 27 خرداد 1394, 16:10 عصر
سپاس از وقتی که بنده میدید.

فکر کنم با یک جدول خود ارجاع دهنده بشه این کار رو کرد ولی همان طور که خبر (http://barnamenevis.org/showthread.php?495765-%D8%B3%D8%B7%D8%AD-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D9%BE%D9%88%DB%8C%D8%A7)دارید روی سطح دستری کار می کنم
می خواهم برای هر کاربر براساس سطح دستری هایی که داره منو ایجاد کنم

تا اینجا چند جدول ایجاد کردم
1- جدول دسته بندی هاي منو Menu
2- جدول Permissions که کد جدول بالا رو توش داره (MenuId)
3- جدول واسط RolePermission که مجوز های رول ها را مشخص می کنه (شامل : RoleId,PermissionId)

جدول Permissions با هر دو جدول در ارتباطه

در مجوز ها نام کنترلر و نام اکش رو ذخیره می کنم تا بتونم لینک را بسازم
ترجیه دادم با جدول رول ارتباط بر قرار نکنم و با جستجو رول هر کار بر رو بدست بیارم.

با این کد تونستم تمام اطلاعات سه جدول رو با هم join کنم



var UserPer = db.Permissions
.Select(x => new ViewUserMenu
{
Name = x.Name,
ActionName = x.ActionName,
ControllerName = x.ControllerName,
RoleId = x.RolePermission.Select(Y => Y.RoleId).FirstOrDefault(),
MenuName = x.Menu.Name,
MenuId = x.Menu.CategoryID,
}).ToList();




سوال كه زیاد برام پیش اومده ولی اولین سوالم اینه
ایا می شه کد رو به صورتی نوشت که رول های (RoleId) کاربر رو فیلتر کنه؟
(کد رول های کاربر رو هم قبلتر بدست اوردم و همان طور که می دونید ممکنه هر کاربر چند رول داشته باشه)

دقیقتر بخوام بگم یعنی اینکه کد بالا تمام مجوزهای موجود رو میاره و من می خواهم مجوزهایی رو داشته باشم که شامل رول های کاربر مورد نظر می شه
(بدست اوردن تمام مجوزهای کاربر).


اگه سوالم دقیق مشخص نیست بگید بهتر توضیح بدم
سپاس

سلام.
اینکه شما MenuId را کلید خارجی بدین تو جدول Permissions درست نیست چون لزوما Permission های شما ربطی به وجود منو نداره ! یا شما برای هر گروه کاربری که اگه یادم باشه Role در نظر گرفتید میتونید تعدادی منو تعریف کنید و به این صورت کاربر های عضو گروه کاربری مورد نظر میتونند به منو هاش دسترسی داشته باشند.
اینکه Permission رو قاطی ماجرا کنید یه جوری درست نیس چون Permission ها خیلی جزئی تر از Role های شما هستند . لذا جدول Role شما با جدول Menu درستش اینه که ارتباط n به n داشته باشند.

این جواب چیزی بود که من از گفته های شما گرفتم.

alireza_rashvand
چهارشنبه 27 خرداد 1394, 17:02 عصر
سپاس.
سناریو کلی کار اینه. (فارق از منو)

هر کاربر ,Role هايي داره (مدیر , دانشجو و ...)
هر Role دارای مجوز هایی است (ثبت دانشجو, ثبت استاد و ...)

بنابرین اگر برای رل مجوزها رو مشخص کنیم هر کاربر کافیه رل ها رو بگیره تا مجوزهای لازم رو گرفته باشه.

تا اینجا فکر کنم مشکلی نباشه. (اگر تا اینجا اشکالی هست بفرمایید)

و اما منو ها

حرف شما درسته لزوما مجوز ربطی به منو نداره ولی
چیزی که مدنظر بنده است اینکه زمانی که مجوز ها ثبت می کنیم برای هر مجوز , کنترلر و اکشنش هم مشخص کنیم تا بشه منو رو از دل این مجوزهای کاربر ساخت.
البته نکته که شما گفتیم هم درست است لزوما هر مجوزی نباید در منو اورده بشه.

ولی اگر بخواهیم برای هر Role منو تعريف كنيم دوباره کاری نیست؟!
مثلا فرض کنید
1- کاربری با Role مدیر , مجوز ثبت دانشجو رو بگیره.
2- در مرحله بعد باید در منوِ Role مدیر , هم ثبت دانشجو (یا مدیریت دانشجویان) رو اضافه کنیم تا منوی Role(مدیر) این امکان رو به کاربران دارای Role بده (لینک).

حالا فرض کنید تصمیم گرفته بشه این امکان دوباره از این رل گرفته بشه. بنابرین باید دو کار انجام بشه.
1- مجوز ثبت دانشجو از رل مدیر گرفته بشه (حذف از جدول واسط RolePermission )
2- ثبت دانشجو (مدیریت دانشجویان), از منو ی Role مدیر حذف بشه.

ایا مجبور نیستیم هر بار دو کار رو انجام بدیم؟
البته اگر مجبور باشیم اشکالی نداره ولی ایا نمی شه کار بهتری کرد؟

قصدم از ارتباط مجوز با منو همین بود که یه کار بکنم وقتی مجوزی از Role ي گرفته می شه خود کار از منو هم حذف بشه.... یا اگر اضافه می شه بلافاصله در منو کاربر هم اضافه بشه.... البته نکته ای که شما گفتید (لزوما هر مجوزی در منو اورده نمیشه) رو در نظر نگرفته بودم.


نمی دونم شاید دارم دوباره چرخ را اختراع می کنم :)

salar IT man
چهارشنبه 27 خرداد 1394, 17:58 عصر
این چیزی که الان بحث کردید با خود پست اول تاپیک هم یکی نیست چه برسه با پست قبل شما :لبخند:

اگه درست فهمیده باشم شما قصد دارید که بر اساس مجوز های هر شخص ، منو ای که برای او قابل مشاهده است را Customize کنید. خب دیگه لزومی نداره که جدول منو داشته باشید. شما هم نام Area و نام Controller و نام Action رو نگه دارید تو همین جدول Permission (که گفتید این کار رو کردید)، حالا میشه یه کاری کرد که هنگام افزودن مجوز به هر Role ، مشخص کرد که آیا این رو به صورت منو هم نمایش بده تو پنلش یا نه؟! برای این کار تو جدول واسط بین Permission و Role شما یک فیلد به نام IsMenu مثلا بذارید . اینجوری وقتی مثلا مدیر برای گروه کاربری مدیران داره دسترسی میده میتونه مشخص کنه این دسترسی برای این گروه به صورت منو هم نمایش داده شه (با ثبت IsMenu با مقدار True) .

خب چرا گفتم IsMenu رو تو جدول واسط قرار بده؟ برا اینکه شاید بخوایین این Permission رو برای یه گروه دیگه به صورت منو نشون ندید.

حالا وقتی میخوایم منو گروه مدیران رو براش نشون بدیم ، میریم اون Permission هایی که گروه مدیران داره و تو جدول واسط مقدار IsMenu به صورت True هستش رو میکشیم بیرون و ادامه ماجرا....
خوبه این بحثا ....

alireza_rashvand
چهارشنبه 27 خرداد 1394, 20:15 عصر
:)
پس مشخص شد کامنت اخرم بهتر از همه کامنت های دیگه م چیزی که تو ذهنم هست رو بیان کرده, باز جای شکرش باقیه :لبخند:

IsMenu نکته خوبی بود.
جدول منو رو برای دسته بندی ها گذاشتم, تا بگم هر مجوز تو کدام دسته بندی قرار بگیره, (Menu,SubMenu) اگه دسته بندی رو ایجاد نکنیم منو دسته بندی شده نداریم و همه مجوز ها زیر هم قرار می گیرند.

دارم به نکته ای که گفتید فکر می کنم (در منو نمايش داده بشه یا نه)

بعضی از مجوز ها ذاتا نمی تونه در منو بیاد مثل حذف دانشجو, ویرایش دانشجو چون از قبل باید انتخاب بشه تا id بدست بیاد بعد حذف یا ویرایش انجام بشه پس امکان اینکه در منو بیاد نیست.
ولی بعضی از مجوز ها اینطور نیست مثل ثبت دانجشو, یا لیست دانشحویان ...
ايا لازه این کار رو بکنیم که هر مجوز برای رل خاص امکان نمایشش فرق کنه؟! یا در همان ثبت مجوز این رو مشخص کنیم که در منو بیاد یا نه.
شاید یک مزیت باشه ولی از اون طرف موقعه انتخاب مجوزهای یک کار به کاربر اضافه کردیم هم باید مجوز رو انتخاب کنه هم بگه این نمایش داده بشه یا نه, الان راحت مجوز ها رو تیک می زنه می ره جلو ولی شاید یکم براش سخت باشه به نمایش یا عدم نمایش هم دقت کنه....
و این رو هم باید در نظر بگیریم که کاربر اصلا علم اینکه این مجوز می تونه در منو بیاد یا نه رو داره یا نه,
(فراموش نکنیم که ثبت مجوز با ماست ولی دادن مجوز به رول ها برعهده کاربره )

البته اینها دیگه سلیقه ای است مهم اصل کاره ....

بازهم تشکر می کنم امتحان می کنم ببینم به چه مشکل هایی می خورم.

این جور بحث ها حتما مفید خواهد بود

salar IT man
چهارشنبه 27 خرداد 1394, 23:34 عصر
:)
پس مشخص شد کامنت اخرم بهتر از همه کامنت های دیگه م چیزی که تو ذهنم هست رو بیان کرده, باز جای شکرش باقیه :لبخند:

IsMenu نکته خوبی بود.
جدول منو رو برای دسته بندی ها گذاشتم, تا بگم هر مجوز تو کدام دسته بندی قرار بگیره, (Menu,SubMenu) اگه دسته بندی رو ایجاد نکنیم منو دسته بندی شده نداریم و همه مجوز ها زیر هم قرار می گیرند.

دارم به نکته ای که گفتید فکر می کنم (در منو نمايش داده بشه یا نه)

بعضی از مجوز ها ذاتا نمی تونه در منو بیاد مثل حذف دانشجو, ویرایش دانشجو چون از قبل باید انتخاب بشه تا id بدست بیاد بعد حذف یا ویرایش انجام بشه پس امکان اینکه در منو بیاد نیست.
ولی بعضی از مجوز ها اینطور نیست مثل ثبت دانجشو, یا لیست دانشحویان ...
ايا لازه این کار رو بکنیم که هر مجوز برای رل خاص امکان نمایشش فرق کنه؟! یا در همان ثبت مجوز این رو مشخص کنیم که در منو بیاد یا نه.
شاید یک مزیت باشه ولی از اون طرف موقعه انتخاب مجوزهای یک کار به کاربر اضافه کردیم هم باید مجوز رو انتخاب کنه هم بگه این نمایش داده بشه یا نه, الان راحت مجوز ها رو تیک می زنه می ره جلو ولی شاید یکم براش سخت باشه به نمایش یا عدم نمایش هم دقت کنه....
و این رو هم باید در نظر بگیریم که کاربر اصلا علم اینکه این مجوز می تونه در منو بیاد یا نه رو داره یا نه,
(فراموش نکنیم که ثبت مجوز با ماست ولی دادن مجوز به رول ها برعهده کاربره )

البته اینها دیگه سلیقه ای است مهم اصل کاره ....

بازهم تشکر می کنم امتحان می کنم ببینم به چه مشکل هایی می خورم.

این جور بحث ها حتما مفید خواهد بود

ایده این بود دیگه حالا شما پخته اش کن ارائه بده :لبخندساده:
یا علی

alireza_rashvand
پنج شنبه 28 خرداد 1394, 11:17 صبح
سپاس, گفته هاتون خیلی کمك کرد.

بیشتر این چزی هایی که می نویسم و توضیح میدم برای خودمه تا یادم نره :) وگرنه شما دوستان خودتان استاد هستید.

اگر کسی بعدا این تاپیک رو دید متوجه بشه.
-----------------

ولی عجیبه به 2 مشکل برخوردم که فکرش رو هم نمی کردم خطا بده!

1- برای گرفتن رول های کاربر از این کد استفاده کردم

var userRoles = Roles.GetRolesForUser(User.Identity.Name);


ولی با خطای :
The Role Manager feature has not been enabled.

روبرو شدم !

2- و برای مشخص کردن نمایش یا عدم نمایش از این کد:

model = model.Where(x => x.IsMenu == true);


ولی عجیبه که این خطا رو داد

The specified type member 'IsMenu' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

البته از این نظر عجیبه که فکر می کردم به راحتی این 2 کد کار کنه !

خیلی گشتم و جستجو کردم تا ببینم مشکل از کجاست و باید از چه روشی استفاده کنم ولی به نتیجه ای نرسیدم دوستان اگر میدونه لطفا کمک کنند ببینم مشکل از کجاست

سپاس

salar IT man
پنج شنبه 28 خرداد 1394, 15:28 عصر
سپاس, گفته هاتون خیلی کمك کرد.

بیشتر این چزی هایی که می نویسم و توضیح میدم برای خودمه تا یادم نره :) وگرنه شما دوستان خودتان استاد هستید.

اگر کسی بعدا این تاپیک رو دید متوجه بشه.
-----------------

ولی عجیبه به 2 مشکل برخوردم که فکرش رو هم نمی کردم خطا بده!

1- برای گرفتن رول های کاربر از این کد استفاده کردم

var userRoles = Roles.GetRolesForUser(User.Identity.Name);


ولی با خطای :
The Role Manager feature has not been enabled.

روبرو شدم !

2- و برای مشخص کردن نمایش یا عدم نمایش از این کد:

model = model.Where(x => x.IsMenu == true);


ولی عجیبه که این خطا رو داد

The specified type member 'IsMenu' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

البته از این نظر عجیبه که فکر می کردم به راحتی این 2 کد کار کنه !

خیلی گشتم و جستجو کردم تا ببینم مشکل از کجاست و باید از چه روشی استفاده کنم ولی به نتیجه ای نرسیدم دوستان اگر میدونه لطفا کمک کنند ببینم مشکل از کجاست

سپاس


با توجه به خطا متوجه شدم شما از Form Authentication و سیستم Membership استفاده میکنید!

<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<roleManager enabled="true" />
</system.web>


برای مشکل دوم هم نوع model چیست؟ ساختار مدل رو بذازید اینجا. آیا IsMenu یک فیلد از جدولی است که دارین کوئری میزنید؟ جون این خطا زمانی رخ میدهد که Property موجود در کلاس شما به فیلدی در جدول مورد نظر Map نشده باشد!!! چون قرار است این کوئی Linq هم در اون صورت نمیتونه ترجمه بشه به کوئری Sql

alireza_rashvand
پنج شنبه 28 خرداد 1394, 17:39 عصر
مشکل دوم در معرفی نکردن پارامتر IsMenu در ویو مدل ViewUserMenu بود عذر خواهی می کنم (بعضی وقت از از سر ساده بودن اشتباه ادم دچار سردرگمی می شه :)

اما در مورد مشکل دوم, از Identity 2.0 (http://barnamenevis.org/showthread.php?471502-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-Identity-2-0) استفاده کردم

salar IT man
پنج شنبه 28 خرداد 1394, 18:43 عصر
مشکل دوم در معرفی نکردن پارامتر IsMenu در ویو مدل ViewUserMenu بود عذر خواهی می کنم (بعضی وقت از از سر ساده بودن اشتباه ادم دچار سردرگمی می شه :)

اما در مورد مشکل دوم, از Identity 2.0 (http://barnamenevis.org/showthread.php?471502-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-Identity-2-0) استفاده کردم

کلاس Roles (https://msdn.microsoft.com/en-us/library/system.web.security.roles(v=vs.110).aspx)مربو نیست به Asp.net identity ! این مربوط است به سیستم احراز هویت قبلی که کلاس Membership هم شامل این مجموعه بوده است و شما میتوانستید Provider های شخصی هم به آن اضافه کنید.

اگر با Asp.net Identity کار میکنید یا با RoleManager سرو کار دارین یا اینکه RoleManager شخصی خود رو پیاده سازی میکنید با توجه به اینترفیس های ارائه شده!

alireza_rashvand
پنج شنبه 28 خرداد 1394, 21:46 عصر
بعد از تاپیک Identity 2.0 (http://barnamenevis.org/showthread.php?471502-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-Identity-2-0) تاپیک Role در MVC (http://barnamenevis.org/showthread.php?483438-Role-%D8%AF%D8%B1-MVC) رو ادامه دادم تا با رل اشنا بشم.

برای کار با رل هم از کنترلر RolesAdminController استفاده کردم


این کد رو تست کردم

var userRoles = Roles.GetRolesForUser(User.Identity.Name);


در کنترلر UsersAdmin هم از کد

var userRoles = await UserManager.GetRolesAsync(userId);


استفاده کردم ولی باز جوابی نداد.



اگر با Asp.net Identity کار میکنید یا با RoleManager سرو کار دارین یا اینکه RoleManager شخصی خود رو پیاده سازی میکنید با توجه به اینترفیس های ارائه شده!

پس لطفا اگر می تویند بگید که از RoleManager برای بدست اوردن رل های کاربر چطور باید استفاده کنم.

سپاس.

salar IT man
پنج شنبه 28 خرداد 1394, 22:03 عصر
بعد از تاپیک Identity 2.0 (http://barnamenevis.org/showthread.php?471502-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-Identity-2-0) تاپیک Role در MVC (http://barnamenevis.org/showthread.php?483438-Role-%D8%AF%D8%B1-MVC) رو ادامه دادم تا با رل اشنا بشم.

برای کار با رل هم از کنترلر RolesAdminController استفاده کردم


این کد رو تست کردم

var userRoles = Roles.GetRolesForUser(User.Identity.Name);


در کنترلر UsersAdmin هم از کد

var userRoles = await UserManager.GetRolesAsync(userId);


استفاده کردم ولی باز جوابی نداد.



پس لطفا اگر می تویند بگید که از RoleManager برای بدست اوردن رل های کاربر چطور باید استفاده کنم.

سپاس.


اگر از سیستم قبلی استفاده میکنید لازم است Provider آن را در فایل پیکربندی مشخص کنید . این Provider میتونه شخصی هم باشه.

عذر میخوام منظورم همون UserManager بود . ولی این متد GetRolesAsync آی دی رول هارو بهتون میده. میتونید به شکل زیر بدون استفاده از کلاس های مذکور عمل کنید:


var _context =new ApplicationDbContext();
var userRolesQuery = from role in _context.Roles
from user in role.Users
where user.UserId == userId
select role;



میتوانید RoleManger اختصاصی خودتون رو هم داشته باشید. برای مثال:اینجا رو ببیند (https://github.com/rabbal/RabbalShopCMS/blob/master/RabbalShopCMS.ServiceLayer/EFServiecs/ApplicationRoleManager.cs)

توصیه میکنم سورس Asp.net Identity رو بررسی کنید مفید خواهد بود. اینجا (https://github.com/aspnet/Identity/tree/dev/src)
بعدش هم این دوره رو بگذرونید :معکوس سازی وابستگی ها (http://www.dotnettips.info/courses/details/5)
بعد هم معکوس سازی رو اعمال کنید به Asp.net Identity (http://www.dotnettips.info/post/1937/%D8%A7%D8%B9%D9%85%D8%A7%D9%84-%D8%AA%D8%B2%D8%B1%DB%8C%D9%82-%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C%E2%80%8 C%D9%87%D8%A7-%D8%A8%D9%87-%D9%85%D8%AB%D8%A7%D9%84-%D8%B1%D8%B3%D9%85%DB%8C-asp-net-identity)

این مباحث ضروری نیست ولی یه توصیه دوستانه است .

alireza_rashvand
جمعه 29 خرداد 1394, 06:50 صبح
سپاس
RoleManger اختصاصی خیلی خوب بود مواردی که گفتید رو تست می کنم

توصیه دوستانتان هم خیلی سنگین بود :))

به هر حال همینکه برای بنده وقت می ذارید بسیار تشکر می کنم.

alireza_rashvand
شنبه 30 خرداد 1394, 10:56 صبح
ولی این متد GetRolesAsync آی دی رول هارو بهتون میده. میتونید به شکل زیر بدون استفاده از کلاس های مذکور عمل کنید:


var _context =new ApplicationDbContext();
var userRolesQuery = from role in _context.Roles
from user in role.Users
where user.UserId == userId
select role;





کد که گفتید جواب میده ولی هنوز متوجه نشدم چرا GetRolesAsync استفاده کردم ان خطا رو داد, شما متوجه شدید؟

salar IT man
شنبه 30 خرداد 1394, 16:48 عصر
کد که گفتید جواب میده ولی هنوز متوجه نشدم چرا GetRolesAsync استفاده کردم ان خطا رو داد, شما متوجه شدید؟

چه خطایی؟ شما هیچ خطایی رو گزارش ندادید. شما گفتید فقط جواب نگرفتید.

دوست من متد مذکور Id رول ها رو بهت میده.تو خود رول هارو نیاز داشتی !

alireza_rashvand
دوشنبه 01 تیر 1394, 14:23 عصر
چه خطایی؟ شما هیچ خطایی رو گزارش ندادید. شما گفتید فقط جواب نگرفتید.


The Role Manager feature has not been enabled. (http://barnamenevis.org/showthread.php?498663-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%85%D9%86%D9%88%DB%8C-%D9%BE%D9%88%DB%8C%D8%A7&p=2229064&viewfull=1#post2229064)

salar IT man
دوشنبه 01 تیر 1394, 15:28 عصر
The Role Manager feature has not been enabled. (http://barnamenevis.org/showthread.php?498663-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%85%D9%86%D9%88%DB%8C-%D9%BE%D9%88%DB%8C%D8%A7&p=2229064&viewfull=1#post2229064)

جوابش رو داده بودم فقط به درستی نشون داده نمیشد تو پست. آپدیت شد !

salar IT man
دوشنبه 01 تیر 1394, 15:31 عصر
The Role Manager feature has not been enabled. (http://barnamenevis.org/showthread.php?498663-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%85%D9%86%D9%88%DB%8C-%D9%BE%D9%88%DB%8C%D8%A7&p=2229064&viewfull=1#post2229064)

جوابش رو داده بودم فقط به درستی نشون داده نمیشد تو پست. آپدیت شد ! در ضمن خطا مربوط به متد Roles.GetRolesForUser بود.

alireza_rashvand
دوشنبه 01 تیر 1394, 16:32 عصر
متاسفانه در هر دو کد همان خطا (http://barnamenevis.org/showthread.php?498663-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%85%D9%86%D9%88%DB%8C-%D9%BE%D9%88%DB%8C%D8%A7&p=2229308&viewfull=1#post2229308)رو میده.
بگذریم ... کد شما کارم رو راه می اندازه ولی می خواستم بدونم علت خطاش چیست تا یاد بگیرم, به هر حال خیلی مهم نیست همان کد خیلی کمک کرد ممنون.

ولی الان یادم افتاد که اصل سوال این تاپیک بدون جواب موند :)

با این کد تمام مجوز های کاربر رو بدست میارم (همراه با نام دسته بندی منو, نام مجوز)

var model = db.Permissions
.Select(x => new ViewUserMenu
{
Name = x.Name,
NameEn = x.NameEn,
ActionName = x.ActionName,
ControllerName = x.ControllerName,
RoleId = x.RolePermission.Select(Y => Y.RoleId).FirstOrDefault(),
CategoryMenuName = x.CategoryMenu.Name,
CategoryMenuNameEn = x.CategoryMenu.NameEn,
CategoryMenuId = x.CategoryMenu.CategoryID,
IsMenu = x.IsMenu
})
.Where(x => userRoles.Contains(x.RoleId) && x.IsMenu == true);


بیشتر مثال موجود در اینترنت, برای ساخت منو از دیتابیس, از جدول خودارجاع دهند استفاده کردند.

ولی نمی دونم بهتر روش برای پیاده کردن منو براساس جدول (model) بدست اومده چیه؟!

یه چیزهایی به ذهنم می رسه مثل اینکه همه Menu ها رو بدست بیارم بفرستم به ویو بعد اونجا SubMenu ها رو جدا کنم اما فکر می کنم راه حل بهتری هم پیدا می شه به دنبال یک راه حل مبتکرانه هستم ...
نمی دونم متوجه منظورم شدید یا نه (اگه نه, بگید تا بهتر توضیح بدم.)

خلاصه اینکه از جدول(کد بالا) چطور منو رو بکشم بیرون
جزئیات پیاده سازی رو خودم حل می کنم به دنبال سناریو کلی برای بدست اوردن Menu Subو Menu هستم
پیشنهاد شما چیه؟

سپاس

alireza_rashvand
سه شنبه 02 تیر 1394, 12:58 عصر
پشنهاد خودم رو تست کردم , کدش رو می ذارم تا دیگران استفاده کنند
(توضیحاتی هم میدم تا خودم یادم نره و اگر کسی نمی دونه یاد بگیره)

در اکشن مقدار دسته بندی ها رو با کد زیر بدست میارم و به ویو می فرستم.


ViewBag.Menus = model.Select(x => new ViewMenu
{
CategoryMenuId = x.CategoryMenuId,
CategoryMenuName = x.CategoryMenuName,
CategoryMenuNameEn = x.CategoryMenuNameEn,
CategoryMenuIconName = x.CategoryMenuIconName
}).Distinct(new MenusComparer()).ToList();

چند نکته از کد :
برای ارسال مقادیر مختلف با ViewBag نیاز هست ان را با فرمت ViewMenu ارسال کنیم تا نوع مقادیر رو بتونه تشخیص بده.

Distinct رو پیاده سازی کردم تا برای حذف کردن مقادیر تکرای ازش استفاده کنم (برای مطالعه 1 (http://www.dotnettips.info/post/355/%D9%BE%DB%8C%D8%AF%D8%A7-%DA%A9%D8%B1%D8%AF%D9%86-%D8%A2%DB%8C%D8%AA%D9%85%E2%80%8C%D9%87%D8%A7%DB%8 C-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1%DB%8C-%D8%AF%D8%B1-%DB%8C%DA%A9-%D9%84%DB%8C%D8%B3%D8%AA-%D8%A8%D9%87-%DA%A9%D9%85%DA%A9-linq) و 2 (http://www.dotnettips.info/post/1569/%D8%AB%D8%A8%D8%AA-%D9%84%DB%8C%D9%86%DA%A9%E2%80%8C%D9%87%D8%A7%DB%8 C-%D8%BA%DB%8C%D8%B1%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1%D B%8C))

در ویو هم از کد زیر برای پیاده کرده منو استفاده کردم

@foreach (var Ms in ViewBag.)
{
@Ms.CategoryMenuName
@foreach (var item in Model)
{
if (item.CategoryMenuId == Ms.CategoryMenuId)
{
@Html.ActionLink(linkText: item.Name, actionName: item.ActionName, controllerName: item.ControllerName)
}
}
}


ان شا الله تاپیک مفیدی شده باشه

با سپاس از دوستان بخصوص اقا سالار...