我正在尝试在控制器中组织分组数据以在我的视图中使用。
我有以下解决方案,但收到以下错误:
"已经有一个与此命令关联的打开的 DataReader,必须先关闭它。"
给定 2 组相关数据:一组问题及其所属的类别,由以下类表示
Category
Question
我想按类别对问题进行分组,通过外键连接
categoryId
下面是一些示例数据:
类别
category1 { Id = 1, Name = "Info about you" }
category2 { Id = 2, Name = "Info about your pet" }
问题
question1 { categoryId = 1, Text = "What's your name?" }
question2 { categoryId = 1, Text = "What's your age?" }
question3 { categoryId = 2, Text = "What kind of pet do you have?"
question4 { categoryId = 2, Text = "What color is your pet?"
所需的 HTML 输出将是这样的
关于您的信息
- 你叫什么名字?
- 你多大了?
有关您宠物的信息
- 你有什么样的宠物?
- 你的宠物是什么颜色的?
所以我的想法是将类别名称和相关问题的信息放入 ViewModel 中,如下所示:
public class CategoriesWithQuestions() {
public string Name { get; set; }
public IEnumerable<Question> Questions { get; set; }
}
然后在我的控制器中,我会使用查询将数据放入 ViewModel:
public ActionResult MyAction() {
var categoriesWithQuestions =
db.Categories()
.Select(category => new CategoriesWithQuestions()
{
Name = category.Name,
Questions = db.Questions().Where(Queryable => q.CategoryId == category.Id)
});
return View(categoriesWithQuestions);
}
并在视图中使用 ViewModel,方法是循环访问类别的名称属性和关联的问题,这两个访问器都是 ViewModel 类中的访问器:
@model IEnumerable<App.ViewModels.CategoriesWithQuestions>
...
@foreach (var category in Model)
{
<h3>@category.Name</h3>
<ul>
@foreach (App.Models.Question Question question in category.Questions)
{
<li>@question.Text</li>
}
</ul>
}
名称正常,但在尝试访问视图中的问题时会发生错误。
对修复我当前解决方案或替代(更好)解决方案的想法持开放态度。
试试这个
public ActionResult MyAction() {
var categoriesWithQuestions =
from c in db.Categories()
join q in db.Questions() on c.Id equals q.CategoryId into lj
from q in lj.DefaultIfEmpty()
group new {q,c} by c into grp
select new CategoriesWithQuestions
{
Name = grp.Key.Name,
Questions = grp.Select(x=>x.q)
}
return View(categoriesWithQuestions);
}