ASP.NET MVC 5在post方法中没有从HiddenFor获取值

时间:2015-01-22 18:16:38

标签: c# asp.net asp.net-mvc

当我尝试在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" />
}

1 个答案:

答案 0 :(得分:1)

我发现了错误,这很容易。

if(subject.Name == null)
                {
                    **//EXCEPTION IS HERE!**
                    results.Question = context.Questions.SingleOrDefault(q => q.ID == question.ID).Text;
                }

问题在于

subject.Name == null 

因为我没有将subject.Name从view发布到post方法。当我将其更改为

subject.ID == null 

一切都很好。

相关问题