ASP.NET MVC:JavaScript插入索引字段至列表及调查问题访问故障
Questions List in Your ASP.NET MVC Survey Model Hey there, let's work through this problem you're having with accessing the Questions list in your Survey model. Based on the code snippets you shared, here are the most common fixes and checks to resolve this:
1. Explicitly Include the Navigation Property (Entity Framework)
The most likely culprit here is that Entity Framework isn't loading the Questions related to your Survey by default. Since your Questions property isn't marked as virtual (which enables lazy loading), you need to explicitly include it when querying the database.
In your controller, update your survey query to use Include() to load the related questions:
using System.Data.Entity; // For EF6; use Microsoft.EntityFrameworkCore for EF Core // Example in your SurveyController public ActionResult Details(int id) { var survey = db.Surveys .Include(s => s.Questions) // This ensures Questions are loaded with the Survey .FirstOrDefault(s => s.SurveyID == id); if (survey == null) { return HttpNotFound(); } return View(survey); }
2. Verify Your Model Relationships
Make sure your one-to-many relationship between Survey and Question is properly configured. Right now, your Question model has a SurveyID foreign key, but it's missing a navigation property back to the Survey. Adding this will help Entity Framework understand the relationship better:
Update your Question model:
public class Question { public int QuestionID { get; set; } public int SurveyID { get; set; } public string Text { get; set; } // Assuming you have a question text property public Survey Survey { get; set; } // Add this navigation property }
You can also enforce the relationship using Fluent API in your DbContext to avoid any ambiguity:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Survey>() .HasMany(s => s.Questions) .WithRequired(q => q.Survey) .HasForeignKey(q => q.SurveyID) .WillCascadeOnDelete(true); // Optional: enables deleting questions when a survey is deleted }
3. Ensure Questions Are Properly Saved to the Database
Double-check that when you create a survey and add questions to it, you're saving the relationship correctly. Here's an example of how to properly create and save a survey with questions:
public ActionResult Create(SurveyViewModel model) { if (ModelState.IsValid) { var survey = new Survey { Name = model.Name }; // Add questions to the survey's Questions list foreach (var questionViewModel in model.Questions) { survey.Questions.Add(new Question { Text = questionViewModel.Text }); } db.Surveys.Add(survey); db.SaveChanges(); // This will automatically set the SurveyID on each question return RedirectToAction("Index"); } return View(model); }
4. Guard Against Null References
Even though your Survey constructor initializes the Questions list, if you're loading the survey from the database without Include(), the list might be null (especially in EF Core when lazy loading is disabled). Always add a null check before accessing the list:
// In your view or controller if (survey.Questions != null && survey.Questions.Any()) { // Iterate over the questions foreach (var question in survey.Questions) { // Do something with the question } }
If you're still running into issues, sharing the specific error message (like a NullReferenceException or empty list when you expect data) would help narrow things down further!
内容的提问来源于stack exchange,提问作者HereToLearn

