2017-04-25 1 views
0

Ich benutze Razor mit MVC 5, C# und ein Modell (ClassTestQuestion), die mit einem anderen Modell (ClassTestQuestionMc) verwandt ist.MVC on submit bekommen Null-Objekt zurück in Controller

I Aktivieren Sie einige Kontrollkästchen, und wenn ich Submit-Taste (Ende) im Controller drücken, bekomme ich null Objekt zurück. Wie kann ich die Ergebnisse zurückbekommen?

In Aussicht:

@model IEnumerable<OnlineLearningMVC.Models.ClassTestQuestion> 

    @using (Html.BeginForm("FinishTest", "ClassTestQuestions", FormMethod.Post)) 
    { 
     @Html.AntiForgeryToken() 




     foreach (var item in Model) 
     { 
     @Html.DisplayFor(model => item.QuestionTx) 
      @Html.HiddenFor(model => item.Id) 
      @Html.HiddenFor(model => item.QuestionTx) 
     <br/> 
     <br /> 
     foreach (var Question in item.ClassTestQuestionMc) 
      { 
      @Html.DisplayFor(model => Question.AnswerTx) 
       @Html.HiddenFor(model => Question.AnswerTx) 
      @Html.CheckBoxFor(model => Question.IsChecked) 
       @Html.HiddenFor(model => Question.IsChecked) 


      } 

    } 


     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="FinishTest" class="btn btn-default" /> 
      </div> 
     </div> 

In Controller:

public ActionResult ClassCourseTest(int IdCourse) 
     { 
      var classTestQuestions = db.ClassTestQuestions.Include(c=>c.ClassTestQuestionMc).Include(c => c.ClassTest).Where(i=>i.ClassTestId== IdCourse); 
      return View("ClassCourseTest", classTestQuestions.ToList()); 
     } 

    [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult FinishTest(ClassTestQuestion classTestQuestion) 
     { 
return View(classTestQuestion); 
     } 

Mein ClassTestQuestion Modell:

namespace OnlineLearningMVC.Models 
{ 
    public class ClassTestQuestion 
    { 
     public int Id { set; get; } 


     public int ClassTestId { set; get; } 

     public virtual ClassTest ClassTest { set; get; } 

     [Required] 
     [DisplayName("Question")] 
     public string QuestionTx { set; get; } 
     [Required] 
     [DisplayName("Order")] 
     public int OrderInt { get; set; } 



     [DisplayName("Disabled")] 
     public bool IsDeleted { set; get; } 

     public string CreatedFrom { set; get; } 

     public DateTime CreatedDate { set; get; } 

     public string UpdatedFrom { set; get; } 

     public DateTime UpdatedDate { set; get; } 

     public virtual ICollection<ClassTestQuestionMc> ClassTestQuestionMc { set; get; } 
    } 

Mein ClassTestQuestionMc Modell:

namespace OnlineLearningMVC.Models 
{ 
    public class ClassTestQuestionMc 
    { 

     public int Id { set; get; } 

     public int ClassTestQuestionId { set; get; } 

     public virtual ClassTestQuestion ClassTestQuestion { set; get; } 

     [Required] 
     public string AnswerTx { set; get; } 

     [DisplayName("Is Correct Answer?")] 
     public bool IsCorrectAnswer { set; get; } 

     public bool IsChecked { set; get; } 

     [DisplayName("Disabled")] 
     public bool IsDeleted { set; get; } 

     public string CreatedFrom { set; get; } 

     public DateTime CreatedDate { set; get; } 

     public string UpdatedFrom { set; get; } 

     public DateTime UpdatedDate { set; get; } 
    } 

enter image description here

Was ich in Browser sehen: enter image description here

bearbeiten

Ich habe versucht zu IEnumerable zu ändern: enter image description here

+0

Ihr Modell in Sicht ist @model IEnumerable aber Sie erwarten ClassTestQuestion in Post-Aktion? Es ergibt keinen Sinn. – wannadream

+0

Also, welche Lösung schlagen Sie vor? – marios

+0

Wenn das Modell in der Ansicht IEnumerable ist, dann sollte die Aktion es auch erwarten, 'FinishTest (IEnumerable )'. MVC wird die Liste für Sie übernehmen. – wannadream

Antwort

0

ändern ICollection IList für ClassTestQuestionMc. Dann müssen Sie hier der Array-Namenskonvention folgen, damit MVC mit dem View-Modell arbeiten kann.

foreach (int i = 0; i < Model.Count; i++) 
{ 
    @Html.DisplayFor(model => Model[i].QuestionTx) 
    @Html.HiddenFor(model => Model[i].Id) 
    @Html.HiddenFor(model => Model[i].QuestionTx) 
    <br/> 
    <br/> 
    foreach (int j = 0; j < Model[i].ClassTestQuestionMc; j++) 
    { 
     @Html.DisplayFor(model => Model[i].ClassTestQuestionMc[j].AnswerTx) 
     @Html.HiddenFor(model => Model[i].ClassTestQuestionMc[j].AnswerTx) 
     @Html.CheckBoxFor(model => Model[i].ClassTestQuestionMc[j].IsChecked) 
     @Html.HiddenFor(model => Model[i].ClassTestQuestionMc[j].IsChecked) 
    } 
} 
Verwandte Themen