2013-06-20 5 views
1

Я пытался следовать этому, так как он был процитирован в качестве примера во многих местах:MVC 4 TreeView Меню

http://weblogs.asp.net/mikebosch/archive/2008/11/25/hierarchical-treeview-with-asp-net-mvc-jquery.aspx

и придумали следующие (несколько изменений из-за меня, используя mvc4 не 2)

В классе контроллера:

public ActionResult Index() 
    { 

     MenuDBContext db = new MenuDBContext(); 
     ViewData["AllMenu"] = db.Menus.ToList(); 
     return View(db.Menus.ToList().Where(c => c.PId == null)); 

    } 

вид класс:

@{ 
    ViewBag.Title = "Index"; 
} 

@model IEnumerable<Geo.Models.Menu> 

<h2>Index</h2> 

@foreach (var item in Model) 
    { 
     <li> 
      @item 
      @{var children = ViewData["AllMenu"].Where(c => c.PId == item.Id);} 
      @if (children.Count() > 0) 
      { 
       <ul> 
        @{Html.RenderPartial("ItemControl", children);} 
      </ul> 

      } 
    </li> 
    } 

Я не могу для жизни меня разобраться, почему я не могу использовать. Где в ViewData ["AllMenu"] или .Count() для детей. Любые советы о том, куда я иду, будут фантастическими.

ответ

1

Вы должны бросить ViewData [ «AllMenu»], как IEnumerable <

var children = (ViewData["AllMenu"] as IEnumerable<GeomantApp.Models.Menu>).Where(c => c.... 

ViewData является Dictionary<string,object> так, когда вы пытаетесь получить свойство из этого словаря, ASP.NET не имеет возможности узнать, что это такое перед тем, как вы получите ошибки компилятора, если вы сначала не нанесете свой объект.

+0

спасибо! Тем не менее, проблема решена. Однако, где все еще не работает, единственный отображаемый параметр - Enumerator, для меня это не имеет смысла, поскольку это нормально использовать. Где в классе контроллера? – user1857900

+0

Как о литье как IEnumerable bluetoft

+0

'@ {var menuItems = (ViewData [" AllMenu "] как List );} @ {var children = menuItems.Where (c = > c.PId == item.Id);} 'Работает, но кажется немного неаккуратным. IEnumberable не сделал, но спасибо за вашу помощь! – user1857900

Смежные вопросы