.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; }
}

.netmvc 3从控制器传递相关的类

也许可以显式地将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