.netmvc 3从控制器传递相关的类
本文关键字:控制器 netmvc | 更新日期: 2023-09-27 17:59:52
天哪,我的头要杀了我。
好的,我有一个控制器,我想把嵌套的数据传递给视图。我是这样做的:
namespace helpme.mvc.Controllers
{
public class CategoryController : Controller
{
private HelpMeContext db = new HelpMeContext();
public ViewResult Index()
{
var model = db.Category.Include(c => c.SubCategories).ToList();
return View(model);
}
}
}
但它不起作用。子类别显示为空,即使其中有行。有什么建议吗?
使用断点,我看到模型被正确填充,但视图中没有显示任何内容,也没有错误消息。
这是视图代码:
@model IEnumerable<helpme.mvc.Models.Category>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
@Model.First().SubCategories.First().Name // UPDATE, THIS DISPLAYS A VALUE, SO WHY DOES THE CODE BELOW JUST DISPLAY THE FIRST LEVEL (Categories)?
<ul>
@foreach (var c in Model) {
<li>
<ul>
@foreach (var sc in c.SubCategories)
{
@Html.Display(sc.Name)
foreach (var ssc in sc.SubSubCategories)
{
@Html.Display(ssc.Name)
}
}
</ul>
</li>
}
</ul>
出于某种原因,它只显示第一个级别,就好像它没有收到SubCategories一样,尽管断点证明它收到了。
下面是模型,仅供参考:
public class Category
{
public Category()
{
SubCategories = new List<SubCategory>();
}
public int ID { get; set; }
[StringLength(255, MinimumLength = 1)]
public string Name { get; set; }
public ICollection<SubCategory> SubCategories { get; set; }
}
public class SubCategory
{
public SubCategory()
{
SubSubCategories = new List<SubSubCategory>();
}
public int ID { get; set; }
[Required()]
[StringLength(255, MinimumLength = 1)]
public string Name { get; set; }
public Category Category { get; set; }
public ICollection<SubSubCategory> SubSubCategories { get; set; }
}
也许可以显式地将model
定义为List<Category>
。怀疑现在是ObjectQuery<Category>
?你能确认吗?
正如您所知,您的View正在等待一个IEnumerable<helpme.mvc.Models.Category>
。
尝试将模型显式转换为视图所需的类型。
List<Category> model = db.Category.Include(c => c.SubCategories).ToList();
目前尚不清楚问题的根源在哪里:在数据访问中,还是在访问视图中的对象中。你能在那个方法中加载一些伪Category和SubCat,并将已知的好值传递给你的View吗?这将有助于确定问题所在。
我想.Include().ToList()
可能没有做你认为它在做的事情。
SubCategories可能没有映射到传递给视图的Category对象。
尝试使用视图模型手动映射它们:
例如
public class PageViewModel
{
public PageViewModel()
{
this.Categories = new List<Category>();
}
public IEnumerable<Category> Categories {get;set;}
}
etc
在你的代码中:
var viewModel = new PageViewModel();
foreach (var category in db.Categories)
{
var categoryVM = new CategoryViewModel();
foreach (var subcategory in category.SubCategories)
{
categoryVM.SubCategories.Add(....
}
}
etc
先只做一个级别(到SubCategory)来确认。
尝试替换
@Html.Display(sc.Name)
带有
@sc.Name
此外,请记住,您可以始终在视图代码中放置断点,并查看渲染的进展情况。希望你觉得这个有用。-Zs