C# mvc视图无法访问嵌套列表
我有一个类别列表,每个类别可能都有子类别。我在控制器中获得的列表中有正确的记录,但如果我尝试在视图中使用子类别列表,它将不会显示任何内容 课程:C# mvc视图无法访问嵌套列表,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我有一个类别列表,每个类别可能都有子类别。我在控制器中获得的列表中有正确的记录,但如果我尝试在视图中使用子类别列表,它将不会显示任何内容 课程: public class DashboardTile { public int ID { get; set; } public int? CategoryID { get; set; } public string Name { get; set; } public string Description { get;
public class DashboardTile
{
public int ID { get; set; }
public int? CategoryID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
public class DashboardTileBO : DashboardTile
{
public bool IsChecked { get; set; }
public List<DashboardTileBO> DashboardTiles { get; set; }
}
public class AddTileVM
{
public List<DashboardTileBO> DashboardTiles { get; set; }
}
视图:
@model Hugo.BusinessObjects.AddTileVM
&时代;
向桌面添加/删除互动程序
@使用(Ajax.BeginForm(“AddTiles”、“Default”、新的AjaxOptions{OnSuccess=“OnSuccess”}))
{
@Html.AntiForgeryToken();
@对于(变量i=0;iModel.DashboardTiles[i].IsChecked)
@Model.DashboardTiles[i].说明
@*if(@Model.DashboardTiles[i].dashboardartiles.Count>0)
{
对于(var j=0;j<@Model.DashboardTiles[i].DashboarTiles.Count;j++)
{
@(a=>@Model.DashboardTiles[i].dashboardartiles[j].IsChecked)的Html.CheckBoxFor(a=>@Model.DashboardTiles[i]
@Model.DashboardTiles[i].仪表板部件[j].说明
}
}*@
@Html.HiddenFor(a=>Model.DashboardTiles[i].ID)
}
取消
使现代化
}
}
获取列表的方法
public static List<BusinessObjects.DashboardTileBO> GetAllDashBoardTiles(long userId)
{
using (var context = new HugoInternalEntities())
{
var distincCategoryIds = context.DashboardTiles.Select(a => a.CategoryID).Distinct().ToList();
var allTiles = (context.DashboardTiles.Where(a => distincCategoryIds.Contains(a.ID)).Select(x=>
new BusinessObjects.DashboardTileBO
{
ID = x.ID,
Name = x.Name,
Description = x.Description,
})).ToList();
var list = context.DashboardUserTiles.Where(a => a.UserID == userId).Select(a => a.DashboardTileID).ToList();
allTiles.ForEach(a => a.IsChecked = list.Contains(a.ID));
allTiles.ForEach(a=>a.DashboardTiles=context.DashboardTiles.Where(b=>a.ID==b.CategoryID && b.ID != a.ID).Select(x=>
new BusinessObjects.DashboardTileBO
{
ID = x.ID,
Name = x.Name,
Description = x.Description,
}).ToList());
allTiles.ForEach(a => a.DashboardTiles.ForEach(b => b.IsChecked = list.Contains(b.ID)));
return allTiles;
}
}
公共静态列表GetAllDashBoardTiles(长用户ID)
{
使用(var context=new hugonternarities())
{
var distincCategoryIds=context.DashboardTiles.Select(a=>a.CategoryID.Distinct().ToList();
var allTiles=(context.DashboardTiles.Where(a=>distincCategoryIds.Contains(a.ID))。选择(x=>
新BusinessObjects.DashboardTileBO
{
ID=x.ID,
Name=x.Name,
描述=x.描述,
})).ToList();
var list=context.DashboardUserTiles.Where(a=>a.UserID==UserID)。选择(a=>a.DashboardTileID.ToList();
ForEach(a=>a.IsChecked=list.Contains(a.ID));
allTiles.ForEach(a=>a.DashboardTiles=context.DashboardTiles.Where(b=>a.ID==b.CategoryID&&b.ID!=a.ID)。选择(x=>
新BusinessObjects.DashboardTileBO
{
ID=x.ID,
Name=x.Name,
描述=x.描述,
}).ToList());
ForEach(a=>a.DashboardTiles.ForEach(b=>b.IsChecked=list.Contains(b.ID));
归还所有瓷砖;
}
}
在上面的视图中,显示了我的主要类别列表,但如果我取消注释子类别的代码,则不会显示任何内容。请查看我进入的列表的屏幕截图addTileVm
瓷砖清单:
我认为问题可能出在GetAllDashBoardTiles方法上。您是否也可以粘贴此方法。基本上,无论您在何处获取仪表板Tiles,您是否确定
DashboardTitles.Count>0
?无论如何,最好使用DashboarTiles.Count()>0
@Jags请检查我也粘贴了该方法我已经调试了代码并检查了我在控制器中获得了包含20个元素的列表请将视图中的计数器(var I=0;I@for(var i=0;ictrl+alt+e
并在exception
对话框中检查“公共语言运行时异常”
@model Hugo.BusinessObjects.AddTileVM
<link href="~/Content/js/nestable/nestable.css" rel="stylesheet"/>
<script src="~/Content/js/nestable/jquery.nestable.js"></script>
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">Add/Remove Tiles to desktop</h4>
</div>
@using (Ajax.BeginForm("AddTiles", "Default",new AjaxOptions {OnSuccess = "OnSuccess" }))
{
@Html.AntiForgeryToken();
<div class="modal-body">
<div class="row">
<div class="col-lg-12">
@for (var i = 0; i < Model.DashboardTiles.Count; i++)
{
<div class="col-lg-5">
<label class="">
@Html.CheckBoxFor(a=> Model.DashboardTiles[i].IsChecked)
@Model.DashboardTiles[i].Description
</label>
</div>
@*if (@Model.DashboardTiles[i].DashboarTiles.Count > 0)
{
for (var j = 0; j < @Model.DashboardTiles[i].DashboarTiles.Count; j++)
{
<div class="col-lg-5">
<label class="">
@Html.CheckBoxFor(a => @Model.DashboardTiles[i].DashboarTiles[j].IsChecked)
@Model.DashboardTiles[i].DashboarTiles[j].Description
</label>
</div>
}
}*@
@Html.HiddenFor(a=> Model.DashboardTiles[i].ID)
}
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-rounded btn-sm btn-tiles" data-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-rounded btn-sm btn-tiles" >Update</button>
</div>
}
</div><!-- /.modal-content -->
}
public static List<BusinessObjects.DashboardTileBO> GetAllDashBoardTiles(long userId)
{
using (var context = new HugoInternalEntities())
{
var distincCategoryIds = context.DashboardTiles.Select(a => a.CategoryID).Distinct().ToList();
var allTiles = (context.DashboardTiles.Where(a => distincCategoryIds.Contains(a.ID)).Select(x=>
new BusinessObjects.DashboardTileBO
{
ID = x.ID,
Name = x.Name,
Description = x.Description,
})).ToList();
var list = context.DashboardUserTiles.Where(a => a.UserID == userId).Select(a => a.DashboardTileID).ToList();
allTiles.ForEach(a => a.IsChecked = list.Contains(a.ID));
allTiles.ForEach(a=>a.DashboardTiles=context.DashboardTiles.Where(b=>a.ID==b.CategoryID && b.ID != a.ID).Select(x=>
new BusinessObjects.DashboardTileBO
{
ID = x.ID,
Name = x.Name,
Description = x.Description,
}).ToList());
allTiles.ForEach(a => a.DashboardTiles.ForEach(b => b.IsChecked = list.Contains(b.ID)));
return allTiles;
}
}