.net MVC 3 передача связанных классов с контроллера - PullRequest
1 голос
/ 21 июня 2011

Боже, моя голова убивает меня.

Хорошо, у меня есть контроллер, в который я хочу передать вложенные данные в представление.Что я делаю так:

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>

По какой-то причине он отображает только первый уровень, как если бы он не получил подкатегории, хотя точка останова доказывает, что он получил.ссылка:

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 голосов
/ 21 июня 2011

Я думаю, что .Include().ToList(), вероятно, не делает то, что вы думаете.

Субкатегории, вероятно, не отображаются на объекты категории, которые вы передаете в представление.

Попробуйтесопоставляя их вручную с помощью моделей просмотра:

например,

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

...и т. д.

Сначала выполните только один уровень (в подкатегорию) для подтверждения.

0 голосов
/ 22 июня 2011

Попробуйте заменить

@Html.Display(sc.Name)

с

@sc.Name

Также, пожалуйста, помните, что вы всегда можете поставить точки останова в коде представления и посмотреть, как идет рендеринг. Надеюсь, вы найдете это полезным. -Zs

0 голосов
/ 21 июня 2011

Возможно, явно введите ваш model как List<Category>. Подозреваю, что в настоящее время ObjectQuery<Category>? Вы можете подтвердить?

Как вы знаете, ваше мнение ожидает IEnumerable<helpme.mvc.Models.Category>.

Попробуйте явно привести вашу модель к типу, который хочет ваш View.

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

Непонятно, где корень проблемы: в доступе к данным или в доступе к объектам в представлении. Можете ли вы загрузить в этот метод несколько фиктивных Category и SubCat и передать известные хорошие значения в View? Это поможет определить, в чем проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...