列表中的 ASP.NET MVC C# 列表

Posted

技术标签:

【中文标题】列表中的 ASP.NET MVC C# 列表【英文标题】:ASP.NET MVC C# list inside list 【发布时间】:2022-01-09 15:16:56 【问题描述】:

我正在使用 ASP.NET MVC 来让用户参加考试,每个考试都包含一个问题列表,每个问题都包含多个答案以形成一个选择题。这是我的模型

 public class Exam

    [Key]
    public string ExamID  get; set; 
    public string Name  get; set; 
    public Class Class  get; set; 
    public int Time  get; set; 
    public DateTime Deadline  get; set; 
    public virtual ICollection<Question> Questions  get; set; 
    
    public bool Suffer  get; set; 

public class Question

    public int ID  get; set; 
    public string question  get; set; 
    public ICollection<String> Answer  get; set; 
    public int CorrectAns  get; set; 

当我创建包含多个问题的考试时似乎很好,但是当我想从问题中获取答案列表时,它会为我的答案列表返回 null。C# 是否允许将列表放入列表中,或者它来自另一个列表问题?

这是我在控制器中使用的创建和获取考试的代码: [HttpPost]

    public JsonResult Create(Exam exam,string ClassID)
    
        if (exam.Time.ToString()!=null  ||exam.Deadline==null)
        
            exam.Deadline = new DateTime(1990,1,1);
               
        Class @class = db.Classes.FirstOrDefault(x => x.ClassID == ClassID);          
        exam.Class = @class;
        exam.ExamID = ClassID +exam.Name;
        db.Exams.Add(exam);
        int a=db.SaveChanges();    
        return Json(a);
     
 public ActionResult Details(string id)
    
        if (id == null)
        
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        
        Exam exam = db.Exams.Find(id);
 
        if (exam == null)
        
            return HttpNotFound();
        
        foreach(Question question in exam.Questions)
        
            Debug.WriteLine(question.Answer.Count);
        

我使用 Debug.WriteLine 来检查是否有任何有问题的答案字符串,并在这一步返回 null

【问题讨论】:

你能告诉我们你用来访问列表的代码吗? 是的,您可以拥有一个列表列表。您能否展示创建考试然后尝试提取答案列表的代码? 我在帖子中编辑并添加了我的代码 看起来你只是在访问对象本身而不是关系尝试使用 .Include() .Include(blog =&gt; blog.Posts) docs.microsoft.com/en-us/dotnet/api/… 试图用 Exam = db.Exams.Include(x => x.Questions).FirstOrDefault(x => x.ExamID == id);但它给出了同样的问题 【参考方案1】:

您似乎使用了急切加载。所以你必须使用 Include 方法。 为了获得多层次的深度,您必须在 Include 方法之后使用 ThenInclude。

db.Exams.Include(x => x.Questions).ThenInclude(y => y.Answers).FirstOrDefault(x => x.ExamID == id);

官方文档:https://docs.microsoft.com/en-us/ef/core/querying/related-data/

【讨论】:

已经找了一个小时但是找不到 ThenInclude(),我该如何使用那个方法? 它与 Include 属于同一类。 EntityFrameworkCore => EntityFrameworkQueryableExtensions 即使使用 Then Include... 仍然无法解决问题。 在您的模型中。你有 ICollection 答案。您必须创建类答案并制作 ICollection 答案。答案将具有属性 Id 和 Title 以及外键 Question_id。

以上是关于列表中的 ASP.NET MVC C# 列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中为枚举值添加描述以与 ASP.NET MVC 中的下拉列表一起使用? [复制]

将 JSON 数组绑定到 ASP.NET MVC 3 中的列表的故障模型

使用 C# 在 ASP.NET MVC 3 中创建级联下拉列表的最简单方法

获取 ASP.NET MVC 中的角色列表

@Html.HiddenFor 不适用于 ASP.NET MVC 中的列表

如何从 ASP.NET MVC 中的枚举创建下拉列表? [复制]