PDA

View Full Version : اررور در استفاده از treehelper



raha raad
شنبه 21 بهمن 1396, 09:53 صبح
سلام و عرض ادب.
بنده با توجه به نیاز به چندین سطح زیر منو، از treehelper استفاده کردم ولی با مشکل زیر روبرو شدم و نمی دونم چطور رفعش کنم؟؟؟؟؟؟

فرض کنید منو ها به این صورت وارد شده باشند:

home*
samples*
-submenu1

*aboutus

وقتیکه زیرمنویی وجود نداشته باشه هیچ مشکلی نیست ولی با وجود زیرمنو ها وقتی submenu1 رو ایجاد میکنه و هلپر رو فراخوانی میکنه اررور زیر رو میده و میگه که item.Childe برابر با null است درصورتیکه نمی تونه null باشه. خواهش می کنم بفرمایید چطور میتونم این اررور رو رفع کنم.

147619

لازمه بگم از روشی که در آدرس زیر هست، استفاده کردم:
http://www.dotnettips.info/post/1524/%D8%B3%D8%A7%D8%AE%D8%AA-%D9%85%D9%86%D9%88%D9%87%D8%A7%DB%8C-%DA%86%D9%86%D8%AF-%D8%B3%D8%B7%D8%AD%DB%8C-%D8%AF%D8%B1-asp-net-mvc

a.golzar66
شنبه 21 بهمن 1396, 11:36 صبح
داخل تگ ul را به این صورت تغییر بده ببینید درست میشه آیا


ShowTree(item.childs.orderByDecending(b=>b.id).ToList();)

فکر کنم دستور orderby بعداز ToList بیاد خطا بده

raha raad
شنبه 21 بهمن 1396, 14:19 عصر
داخل تگ ul را به این صورت تغییر بده ببینید درست میشه آیا


ShowTree(item.childs.orderByDecending(b=>b.id).ToList();)

فکر کنم دستور orderby بعداز ToList بیاد خطا بده

سلام. اینکار رو قبلا امتحان کردم ولی درست نشده!!!!! :گریه: :عصبانی++:
فرمایش شما رو بازم امتحان می کنم ببینم چی میشه.... :افسرده:

a.golzar66
شنبه 21 بهمن 1396, 15:04 عصر
اگر مایل بودید کد رو برام بفرستید فکر کنم بتونم درست کنم براتون

mr.sirwan
شنبه 21 بهمن 1396, 19:34 عصر
لطفا مدلتون رو اینجا قرار بدین، احتمالا لیست Childs رو توی مدلتون داخل سازنده پیش فرض، new نکردین

raha raad
یک شنبه 22 بهمن 1396, 07:30 صبح
سلام مجدد.

این مدل مربوطه که البته child از نوع collection بود و من فکر کردم با List شاید فرجی بشه اما نشد!!!!



public class Menu
{
/// <summary>
/// کد یکتایی
/// </summary>
public int Id { get; set; }


/// <summary>
/// عنوان
/// </summary>
public string Title { get; set; }


/// <summary>
/// والد
/// </summary>
//[ForeignKey("ParentId")]
public Menu Parent { get; set; }


/// <summary>
/// کد یکتایی والد
/// </summary>
public int? ParentId { get; set; }


/// <summary>
/// اولویت
/// </summary>
public int Periority { get; set; }


/// <summary>
/// وضعیت
/// </summary>
//public int IsActive { get; set; }




public List<Menu> Childs { get; set; }




}




کدی که در کنترلر مربوطه نوشتم _البته بقیه اکشنهای پیش فرض رو دیگه قرار ندادم:



private DatabaseContext db = new DatabaseContext();




[ChildActionOnly]
public virtual ActionResult UserHorizontalNavBarItems()
{
//var model = db.Menu.Where(category => category.ParentId == null).Include(category => category.Childs).ToList();
var model = db.Menu.Include(x => x.Parent).ToList();
return PartialView("_HorizontalNavigation", model);
}


// GET: Menus
public ActionResult Index()
{
var menu = db.Menu.Include(m => m.Parent);
return View(menu.ToList());
}




و بالاخره اینم از کد هلپر:




@using DynamicMenu.Models
@model IEnumerable<Menu>
<div class="container">
<nav role="navigation" class="navbar navbar-inverse">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" data-target="#navbarCollapse" data-toggle="collapse" class="navbar-toggle">
<span class="sr-only"> Toggle navigation </span>
<span class="icon-bar"> </span>
<span class="icon-bar"> </span>
<span class="icon-bar"> </span>
</button>
<a href="#" class="navbar-brand"> Brand </a>
</div>
<!-- Collection of nav links and other content for toggling -->
<div id="navbarCollapse" class="collapse navbar-collapse">
<ul class="nav navbar-nav">


@{
int _counter = 1;
}


@ShowTree(Model.OrderByDescending(b => b.Periority).Reverse(), _counter)


@helper ShowTree(IEnumerable<DynamicMenu.Models.Menu> mnu, int counter)
{
<ul class="nav navbar-nav pull-right" style="direction:rtl;">
@{
foreach (var item in mnu)
{
<li class="@((counter == 1) ? "nav-item active" : "nav-item" )nav-item">
<a class="nav-link" href="#">@item.Title</a>


@if (item.Childs.Any())
{

<ul class="@((counter == 1) ? "nav-item active" : "nav-item" )nav-item">
@ShowTree(item.Childs.ToList(), counter)
</ul>
}




</li>
counter++;
}//end foreach
}
</ul>
}
</ul>
</div>
</nav>


</div>


@*<script>
$('ul.nav li.dropdown').hover(function () {
$(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500);
},
function () {
$(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);
}
);


</script>*@




<script src="~/Scripts/jquery.min.js"></script>



خواهش می کنم راهنماییم کنید بدجوری گیر کردم!!!!:گریه:

raha raad
یک شنبه 22 بهمن 1396, 07:32 صبح
اگر مایل بودید کد رو برام بفرستید فکر کنم بتونم درست کنم براتون
متاسفانه نمی تونم سلوشن پروژه رو بذارم ولی بخش هایی از کد مربوط به این منو رو قرار دادم. امیدوارم با راهنمایی شما و سایر مهندسین بتونم این مشکل رو رفعش کنم.

a.golzar66
یک شنبه 22 بهمن 1396, 11:10 صبح
سلام
دوست عزیز در کد مربوط به هلپر این قسمت رو عوض کن ببین درست میشه


@model IEnumerable<Menu>


بشه این


@model List<Menu>

mr.sirwan
یک شنبه 22 بهمن 1396, 11:45 صبح
شما داخل کلاس Menu لیست Childs رو new نکردین، به همین خاطر ارور نال میده بتون، داخل سازنده همین کلاس، لیست رو new کنین ببینین مشکل رفع میشه یا خیر؟
public Menu()
{
Childs = new List<Menu>();
}

raha raad
سه شنبه 24 بهمن 1396, 09:42 صبح
سلام مجدد.
من فرمایشات شما رو انجام دادم و حالا زیرمنو نمایش داده میشه اما....در کمال تعجب فقط یه سطح زیر منو نشون میده!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
به تصویر زیر توجه کنید:

147644

همونطور که از تصویر مشخصه، Sub-Menu1 باید یه زیر منو sub-mnu رو داشته باشه. اما می بینید که نداره!!!!!!!!!

mr.sirwan
سه شنبه 24 بهمن 1396, 11:16 صبح
شما این قسمت از ویو رو دیباگ کنین و ببینین ایتم sub-menu1 لیست childs ش عنصری داره یا خیر؟

@if (item.Childs.Any())
{
<ul class="@((counter == 1) ? "nav-item active" : "nav-item" )nav-item">
@ShowTree(item.Childs.ToList(), counter)
</ul>
}

اگر عنصری نداشت احتمالا اشکال در مقدار دهی ستون های جدولتون هستش

raha raad
سه شنبه 24 بهمن 1396, 14:20 عصر
شما این قسمت از ویو رو دیباگ کنین و ببینین ایتم sub-menu1 لیست childs ش عنصری داره یا خیر؟



سلام مجدد.
حتما بررسی می کنم.از صبوریتون سپاسگذارم.

raha raad
پنج شنبه 03 اسفند 1396, 09:48 صبح
}[/CSHARP]
اگر عنصری نداشت احتمالا اشکال در مقدار دهی ستون های جدولتون هستش

سلام.
دقیقا همین مشکلی که فرمودید رو داره برای بررسی و رفعش چه کار باید بکنم؟؟؟ من مدل و دیتابیس رو بررسی کردم و به نظر میاد همه چیز درست باشه!!!!!!! نمی فهمم مشکل از کجاس؟؟؟
میشه بیشتر توضیح بدید که منظور از "اشکال در مقدار دهی ستون های جدول" چیه؟؟؟؟
همونطور که در تصویر قابل مشاهده هست مقداردهی جدول چیز اشتباهی رو نشون نمیده!!!!

mr.sirwan
پنج شنبه 03 اسفند 1396, 19:41 عصر
لطفا اطلاعاتی که توی جدول menu درج کردین رو بذارین

raha raad
جمعه 04 اسفند 1396, 06:47 صبح
اینم یک نمونه از ورود اطلاعات در جدول Menu در دیتابیس.

147707

mr.sirwan
جمعه 04 اسفند 1396, 13:00 عصر
الان این مقادیر مشکلی ندارن، این مقادیر با عکسی که قبلا گذاشتین یکی نیست، تشخیص یکم سخته که الان کدوم منو زیر منو واسش تولید نمیشه، شما مطمئنین این مقادیر هم دقیقا همون مشکل رو دارن؟
یا همون مقادیر رو دوباره توی جدول درج کنین و نتیجه رو گزارش بدین یا این مقادیر جدید رو بررسی کنین که زیرمنو ها بدرستی تولید میشن یا خیر

در ضمن چند نکته رو بگم:
توی متد ShowTree به تگ li و ul دوتا کلاس یکسان رو اضافه کردین:
<li class="@((counter == 1) ? "nav-item active" : "nav-item" )nav-item">
<a class="nav-link" href="#">@item.Title</a>

@if (item.Childs.Any())
{
<ul class="@((counter == 1) ? "nav-item active" : "nav-item" )nav-item">

اینارو به اینصورت تغییر بدین:

<li class="@((counter == 1) ? "nav-item active" : "nav-item" )">
<a class="nav-link" href="#">@item.Title</a>

@if (item.Childs.Any())
{
<ul class="@((counter == 1) ? "nav-item active" : "nav-item" )">
نکته دوم:
توی اکشن UserHorizontalNavBarItems موقع واکشی منو ها، برای واکشی فرزندها یا از متد include استفاده کنین، و یا داخل کلاس Menu برای لیست childs بعد از کلمه public از کلمه کلیدی virtual استفاده کنین

این تغییرات رو انجام بدین و نتیجه رو گزارش بدین

raha raad
شنبه 05 اسفند 1396, 10:03 صبح
سلام مجدد.

در هر دو صورتی که داده وارد کردم فقط یه سطح زیرمنو نشون داده میشه متاسفانه. تغییراتی که فرمودید رو اعمال می کنم و نتیجه رو اطلاع می دم.

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