Child Partial View MVC5上的帖子上的模型为空

时间:2014-08-11 12:43:23

标签: asp.net-mvc-5 asp.net-mvc-5.1

我在另一个帖子中问了这个问题,但我从来没有得到答案。希望有光明的人可以帮助我。

基本上我尝试的是将TestModel返回到ActionResult问题(TestModel测试,FormCollection formCollection)。每当在_Question.cshtml中按下下一个按钮时,部分视图ActionResult索引(TestModel测试)与空模型绑定,因此我无法从用户那里获得任何填充我的testModel的内容。请帮忙

///////////////模型//////////////

[Serializable]
    public class TestModel
    {
        private QuestionModel _currenQuestionModel;

        public int TestID { get; set; }
        public string TestName { get; set; }

        public string Instructions { get; set; }

        public double TestTime { get; set; }

        public QuestionModel CurrenQuestionModel
        {
            get
            {
                if (_currenQuestionModel == null &&
                    Questions != null && 
                    Questions.Count > 0)
                    _currenQuestionModel = Questions.First();

                return _currenQuestionModel;
            }
            set { _currenQuestionModel = value; }
        }

        public List<QuestionModel> Questions { get; set; }
    }

    public class QuestionModel
    {
        public int QuestionID { get; set; }
        public string Question { get; set; }
        public bool HasMultipleAnswers { get; set; }
        public IList<PossibleAnswerModel> PossibleAnswers { get; set; }   
    }

    public class PossibleAnswerModel
    {
        public bool IsSelected { get; set; }
        public string DisplayText { get; set; }
    }
}

//////////////////控制器/////////////////

 public class TestController : Controller
            {
                public ActionResult Index(int id)
                {
                    var model = _testColletion.FirstOrDefault(r => r.TestID == id);
                    return View(model);
                }
     [HttpPost]
        public ActionResult Index(TestModel test)
        {
            //var model = (TestModel) Session["CurrentTest"];
            return View(test);
        }

                [ChildActionOnly]
                [HttpGet]
                public ActionResult Questions(TestModel test)
                {
                    var testModel = _testColletion.Single(r => r.TestID == test.TestID);
                    return PartialView("_Start", testModel);
                }

                [HttpPost]
                public ActionResult Questions(TestModel test, FormCollection formCollection)
                {
                    var q = formCollection.Count >2 ?  formCollection.GetValues(1):null;
                    var testModel = _testColletion.FirstOrDefault(r => r.TestID == test.TestID);

                    //if (questionID == 0)
                    //{
                    //    testModel.CurrenQuestionModel = testModel.Questions.First();
                    //}
                    if (!string.IsNullOrWhiteSpace(Request["next"]))
                    {
                        var nextQuestionIndex =
                            testModel.Questions.FindIndex(r => r.QuestionID == testModel.CurrenQuestionModel.QuestionID) + 1;
                        testModel.CurrenQuestionModel = testModel.Questions[nextQuestionIndex];
                    }
                    else if (!string.IsNullOrWhiteSpace(Request["prev"]))
                    {
                        var prevQuestionIndex =
                           testModel.Questions.FindIndex(r => r.QuestionID == testModel.CurrenQuestionModel.QuestionID) - 1;

                        testModel.CurrenQuestionModel = testModel.Questions[prevQuestionIndex];
                    }

                    return PartialView("_Question", testModel);
                }
                private static List<TestModel> _testColletion = new List<TestModel>()
                {
                    new TestModel()
                    {
                        TestID = 1,
                        TestName = "ASP.NET",
                        Instructions = "Please choose from appropriate options",
                        TestTime = 2.40,
                         Questions = new List<QuestionModel>()
                        {
                            new QuestionModel(){QuestionID = 1, Question = "Question 1"}
                        }

                    },
                    new TestModel()
                    {
                        TestID = 2,
                        TestName = "ASP.NET MVC",
                        Instructions = "Please choose from appropriate options",
                        TestTime = 1.00,
                        Questions = new List<QuestionModel>()
                        {
                            new QuestionModel(){QuestionID = 1, HasMultipleAnswers=true, Question = "Question 1", PossibleAnswers = new List<PossibleAnswerModel>()
                            {
                                new PossibleAnswerModel(){DisplayText = "Possible Answer 1"},
                                new PossibleAnswerModel(){DisplayText = "Possible Answer 2"},                   
                                new PossibleAnswerModel(){DisplayText = "Possible Answer 3"},   
                                new PossibleAnswerModel(){DisplayText = "Possible Answer 4"},   
                            }},
                            new QuestionModel(){QuestionID = 2, HasMultipleAnswers=true, Question = "Question 2"},
                            new QuestionModel(){QuestionID = 3, HasMultipleAnswers=true, Question = "Question 3"},
                            new QuestionModel(){QuestionID = 4, HasMultipleAnswers=true, Question = "Question 4"},
                            new QuestionModel(){QuestionID = 5, HasMultipleAnswers=true, Question = "Question 5"},
                        }
                    },
                    new TestModel()
                    {
                        TestID = 3,
                        TestName = "ASP.NET Spring",
                        Instructions = "Please choose from appropriate options",
                        TestTime = 1.00,
                         Questions = new List<QuestionModel>()
                        {
                            new QuestionModel(){QuestionID = 1, Question = "Question 1"},
                            new QuestionModel(){QuestionID = 2, Question = "Question 2"},
                            new QuestionModel(){QuestionID = 3, Question = "Question 3"},
                            new QuestionModel(){QuestionID = 4, Question = "Question 4"},
                        }
                    },
                    new TestModel()
                    {
                        TestID = 4,
                        TestName = ".NET C#",
                        Instructions = "Please choose from appropriate options",
                        TestTime = 4.40,
                         Questions = new List<QuestionModel>()
                        {
                            new QuestionModel(){QuestionID = 1, Question = "Question 1"},
                            new QuestionModel(){QuestionID = 2, Question = "Question 2"}
                        }
                    }
                };
            }

///////////里面_Question.cshtml局部视图///////////////

@model InterviewQ.MVC.Models.TestModel

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    @*@Html.HiddenFor(r => r.CurrentQuestionID)*@
    <div>
        <br />
        <h4>Question @Model.CurrenQuestionModel.QuestionID</h4>
        <hr />
        <p>@Model.CurrenQuestionModel.Question</p>
    </div>
    <p>
     @if (Model.CurrenQuestionModel.HasMultipleAnswers)
     {
         @Html.Partial("_MultipleAnswerQuestionView", Model.CurrenQuestionModel)
     }
    </p>
    <p>
        @if (Model.CurrenQuestionModel.QuestionID > 0 && Model.CurrenQuestionModel.QuestionID < Model.Questions.Count)
        {
            if (Model.CurrenQuestionModel.QuestionID > 1)
            {
                <input type="submit" class="btn btn-default" value="Previous" name="prev" />
            }

            <input type="submit" class="btn btn-default" value="Next" name="next" />
        }
        @if (Model.CurrenQuestionModel.QuestionID == Model.Questions.Count)
        {
            <input type="submit" class="btn btn-default" value="Finish" name="finish" />
        }
    </p>
}

////////////里面_MultipleAnswerQuestionView.cshtml局部视图///////////////

@model InterviewQ.MVC.Models.TestModel

@if (!Model.CurrenQuestionModel.HasMultipleAnswers)
{
    throw new InvalidOperationException("This answer optioin template doesn't support this type of questions");
}

@for (var i = 0; i < Model.CurrenQuestionModel.PossibleAnswers.Count; i++)
{ 
<div class="row">
    <div class="col-lg-6">
        <div class="input-group">
            <span class="input-group-addon">
                @Html.CheckBoxFor(r => r.CurrenQuestionModel.PossibleAnswers[i].IsSelected)
                @*<input type="checkbox" value="@Model.CurrenQuestionModel.PossibleAnswers[i].IsSelected" name="@Model.CurrenQuestionModel.PossibleAnswers[i].IsSelected">*@
            </span>
            <p>
                @Model.CurrenQuestionModel.PossibleAnswers[i].DisplayText
            </p>
        </div><!-- /input-group -->
    </div><!-- /.col-lg-6 -->
</div><!-- /.row -->
}

0 个答案:

没有答案