По сути, я возвращаю анонимный тип
Нет.Не сработаетАнонимные типы выводятся компилятором как internal , и поскольку ASP.NET компилирует ваши представления в отдельные сборки во время выполнения, они не могут получить доступ к тем анонимным типам, которые существуют в сборке, которая их определила.
В правильно разработанном приложении ASP.NET MVC вы работаете с моделями представлений.Итак, вы начинаете с определения некоторых:
public class MyViewModel
{
public string CategoryName { get; set; }
public IEnumerable<ItemViewModel> Items { get; set; }
public IEnumerable<EntryViewModel> Entries { get; set; }
}
public class ItemViewModel
{
public int ID { get; set; }
public string Name { get; set; }
}
public class EntryViewModel
{
public int ID { get; set; }
public string Title { get; set; }
}
, а затем адаптируете действие контроллера для передачи этой модели представления в представление:
public ActionResult Subject(int Category)
{
using (var db = new KnowledgeDBEntities())
{
var category = db.categories.Single(c => c.category_id == Category).name;
var items =
from i in db.category_items
where i.category_id == Category
select new ItemViewModel
{
ID = i.category_id,
Name = i.name
};
var entries =
from e in db.item_entry
where items.Any(item => item.ID == e.category_item_id)
select new EntryViewModel
{
ID = e.category_item_id,
Title = e.title
};
var model = new MyViewModel
{
CategoryName = category,
Items = items.ToList(), // be eager
Entries = entries.ToList() // be eager
};
return View(model);
}
}
и, наконец, вы строго вводите свое представление впросмотреть модель, которую вы определили:
@model MyViewModel
@Model.Name
<h2>Items:</h2>
@foreach (var item in Model.Items)
{
<div>@item.Name</div>
}
<h2>Entries:</h2>
@foreach (var entry in Model.Entries)
{
<div>@entry.Title</div>
}
Кстати, чтобы упростить сопоставление между моделями доменов и моделями просмотра, я бы порекомендовал вам проверить AutoMapper .
Ohи поскольку написание foreach
циклов в представлении выглядит некрасиво и не может использоваться повторно, я бы порекомендовал вам использовать шаблоны отображения / редактирования, которые в основном заставили бы вас выглядеть так:
@model MyViewModel
@Model.Name
<h2>Items:</h2>
@Html.DisplayFor(x => x.Items)
<h2>Entries:</h2>
@Html.DisplayFor(x => x.Entries)
, а затем вы должны определитьсоответствующие шаблоны отображения, которые будут автоматически отображаться для каждого элемента соответствующих коллекций:
~/Views/Shared/DisplayTemplates/ItemViewModel
:
@model ItemViewModel
<div>@item.Name</div>
и ~/Views/Shared/DisplayTemplates/EntryViewModel
:
@model EntryViewModel
<div>@item.Title</div>