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

时间:2011-06-21 03:58:06

标签: c# asp.net-mvc asp.net-mvc-3

上帝我的头在杀我。

好的我有一个控制器,我想将嵌套数据传递给视图。我这样做是这样的:

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

但它不起作用。即使子行中有行,SubCategories也是空的。有什么建议吗?

使用断点我看到模型正确填充,但视图中没有显示任何错误信息。

以下是视图代码:

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

3 个答案:

答案 0 :(得分:0)

也许明确地将您的model定义为List<Category>。怀疑它目前是ObjectQuery<Category>?你能证实吗?

如您所知,您的视图需要IEnumerable<helpme.mvc.Models.Category>

尝试将模型明确地转换为View所需的类型。

 List<Category> model = db.Category.Include(c => c.SubCategories).ToList();

问题的根源在于:在数据访问中,还是在访问View中的对象时,尚不清楚。您可以在该方法中加载一些虚拟类别和SubCat,并将已知的好值传递给您的视图吗?这将有助于确定问题所在。

答案 1 :(得分:0)

我猜想.Include().ToList()可能没有做你认为正在做的事情。

SubCategories可能未映射到您传递给视图的Category对象。

尝试使用视图模型手动映射它们:

e.g。

public class PageViewModel
{
    public PageViewModel()
    {
        this.Categories = new List<Category>();
    }

    public IEnumerable<Category> Categories {get;set;}
}

...等

在您的代码中:

var viewModel = new PageViewModel();
foreach (var category in db.Categories)
{
    var categoryVM = new CategoryViewModel();
    foreach (var subcategory in category.SubCategories)
    {
        categoryVM.SubCategories.Add(....      
    }
}

...等

首先只对一个级别(到SubCategory)进行确认。

答案 2 :(得分:0)

尝试替换

@Html.Display(sc.Name)

@sc.Name

另外请记住,您始终可以在视图代码中放置断点,并查看渲染的方式。 希望您觉得这个有帮助。 -zs