ASP.NET MVC 5 不从 post 方法中的 HiddenFor 获取值
ASP.NET MVC 5 don't getting values from HiddenFor in post method
当我尝试在我的 post 方法中从 HiddenFor Helpers 读取值时,我得到类型 'System.NullReferenceException' 的异常(附加信息:对象引用未设置为对象的实例。id 名称'id' 在当前上下文中不存在)。为什么会这样,我该如何阅读这些内容?我得到异常的那一行被注释掉了。
作为我申请的一部分,我需要为学生实施问卷调查,包括一般问题和他们所参加科目的问题。这是控制器的代码:
public class StudentController : Controller
{
private EFDbContext context;
private String index;
public StudentController(string Index = "II-2/10")
{
context = new EFDbContext();
this.index = Index;
}
// GET: Student
public ViewResult Student()
{
Student student = context.Students.Single(i => i.Index.Equals(index));
List<Question> questions = context.Questions.ToList();
StudentVM model = new StudentVM(student,questions);
return View(model);
}
[HttpPost]
public ActionResult Student(StudentVM model)
{
foreach(SubjectVM subject in model.Subjects)
{
foreach(QuestionVM question in subject.Questions)
{
Results results = new Results();
if(subject.Name == null)
{
**//EXCEPTION IS HERE!**
results.Question = context.Questions.SingleOrDefault(q => q.ID == question.ID).Text;
}
else
{
results.Subject = context.Subjects.SingleOrDefault(s => s.ID == subject.ID).Name;
//getting ID of appropriate question in database
int questionID = (question.ID - (int)subject.ID) / (int) Math.Pow(10, subject.ID.ToString().Length);
results.Question = context.Questions.SingleOrDefault(q => q.ID == questionID).Text;
}
results.Answer = context.PossibleAnswers.Single(ans => ans.ID == question.SelectedAnswer).Text;
context.Results.Add(results);
}
}
context.SaveChanges();
return View("Completed", model);
}
}
并查看:
@model Questionnaire.Domain.Models.StudentVM
@{
ViewBag.Title = "Student";
}
@using (Html.BeginForm())
{
for (int i = 0; i < Model.Subjects.Count; i++)
{
@Html.HiddenFor(m => m.Subjects[i].ID)
<h3>@Html.DisplayFor(m => m.Subjects[i].Name)</h3> // display empty string if no name
for (int j = 0; j < Model.Subjects[i].Questions.Count; j++)
{
<div class="well">
@Html.HiddenFor(m => m.Subjects[i].Questions[j].ID)
<h3>@Html.DisplayFor(m => m.Subjects[i].Questions[j].Text)</h3>
@foreach (var answer in Model.Subjects[i].Questions[j].PossibleAnswers)
{
<div>
@Html.RadioButtonFor(m => m.Subjects[i].Questions[j].SelectedAnswer, answer.ID, new { id = answer.ID })
<label for="@answer.ID">@answer.Text</label>
</div>
}
@Html.ValidationMessageFor(m => m.Subjects[i].Questions[j].SelectedAnswer)
</div>
}
}
<input type="submit" class="btn btn-success" value="Confirm" />
}
我发现了错误,这很容易。
if(subject.Name == null)
{
**//EXCEPTION IS HERE!**
results.Question = context.Questions.SingleOrDefault(q => q.ID == question.ID).Text;
}
问题出在
subject.Name == null
因为我没有 post subject.Name 从视图到 post 方法。当我把它改成
subject.ID == null
一切都很好。
当我尝试在我的 post 方法中从 HiddenFor Helpers 读取值时,我得到类型 'System.NullReferenceException' 的异常(附加信息:对象引用未设置为对象的实例。id 名称'id' 在当前上下文中不存在)。为什么会这样,我该如何阅读这些内容?我得到异常的那一行被注释掉了。
作为我申请的一部分,我需要为学生实施问卷调查,包括一般问题和他们所参加科目的问题。这是控制器的代码:
public class StudentController : Controller
{
private EFDbContext context;
private String index;
public StudentController(string Index = "II-2/10")
{
context = new EFDbContext();
this.index = Index;
}
// GET: Student
public ViewResult Student()
{
Student student = context.Students.Single(i => i.Index.Equals(index));
List<Question> questions = context.Questions.ToList();
StudentVM model = new StudentVM(student,questions);
return View(model);
}
[HttpPost]
public ActionResult Student(StudentVM model)
{
foreach(SubjectVM subject in model.Subjects)
{
foreach(QuestionVM question in subject.Questions)
{
Results results = new Results();
if(subject.Name == null)
{
**//EXCEPTION IS HERE!**
results.Question = context.Questions.SingleOrDefault(q => q.ID == question.ID).Text;
}
else
{
results.Subject = context.Subjects.SingleOrDefault(s => s.ID == subject.ID).Name;
//getting ID of appropriate question in database
int questionID = (question.ID - (int)subject.ID) / (int) Math.Pow(10, subject.ID.ToString().Length);
results.Question = context.Questions.SingleOrDefault(q => q.ID == questionID).Text;
}
results.Answer = context.PossibleAnswers.Single(ans => ans.ID == question.SelectedAnswer).Text;
context.Results.Add(results);
}
}
context.SaveChanges();
return View("Completed", model);
}
}
并查看:
@model Questionnaire.Domain.Models.StudentVM
@{
ViewBag.Title = "Student";
}
@using (Html.BeginForm())
{
for (int i = 0; i < Model.Subjects.Count; i++)
{
@Html.HiddenFor(m => m.Subjects[i].ID)
<h3>@Html.DisplayFor(m => m.Subjects[i].Name)</h3> // display empty string if no name
for (int j = 0; j < Model.Subjects[i].Questions.Count; j++)
{
<div class="well">
@Html.HiddenFor(m => m.Subjects[i].Questions[j].ID)
<h3>@Html.DisplayFor(m => m.Subjects[i].Questions[j].Text)</h3>
@foreach (var answer in Model.Subjects[i].Questions[j].PossibleAnswers)
{
<div>
@Html.RadioButtonFor(m => m.Subjects[i].Questions[j].SelectedAnswer, answer.ID, new { id = answer.ID })
<label for="@answer.ID">@answer.Text</label>
</div>
}
@Html.ValidationMessageFor(m => m.Subjects[i].Questions[j].SelectedAnswer)
</div>
}
}
<input type="submit" class="btn btn-success" value="Confirm" />
}
我发现了错误,这很容易。
if(subject.Name == null)
{
**//EXCEPTION IS HERE!**
results.Question = context.Questions.SingleOrDefault(q => q.ID == question.ID).Text;
}
问题出在
subject.Name == null
因为我没有 post subject.Name 从视图到 post 方法。当我把它改成
subject.ID == null
一切都很好。