我对ASP.NET MVC还是很陌生,并且正在从事一个小型测验应用程序项目。但是,我遇到了一个相当烦人的问题。
现在,我有一些模型,包括问题,选择和测验。测验已连接到表单。我在表单中使用局部视图来显示每个问题,在问题中,我使用另一个局部视图来显示选择。
每当我尝试从表单中获得哪些答案时,我都会得到0并返回null。我尝试了很多东西,但是都没有用。
这是我的课
选择
public class Choice
{
public int Id { get; set; }
public string Text { get; set; }
public bool IsAnswer { get; set; }
private Question question = new Question();
public bool IsSelected { get; set; }
public Question Question
{
get { return question; }
set { question = value; }
}
}
问题
public class Question
{
public int Id { get; set; }
private IList<Choice> choices = new List<Choice>();
public string Text { get; set; }
public int OrderNumber { get; set; }
public IList<Choice> Choices
{
get { return choices; }
set { choices = value; }
}
}
测验
public class Quiz
{
public int Id { get; set; }
public IList<Question> questions = new List<Question>();
public string Name { get; set; }
public IList<Question> Questions
{
get { return questions; }
set { questions = value; }
}
}
我的控制器。总是将'zzz'设置为null和0。
[HttpPost]
public ActionResult Grade(Quiz zzz)
{
var grade = quizService.Grade(zzz);
return View(grade);
}
观点。我以前没有ViewDataDictionary,但是那也给了null。我将其更改为ViewDataDictionary,但仍返回null。
注意:我确实添加了注释,但它们不在实际代码中
发布
@model QuizApp.Models.Quiz
@{ ViewBag.Title = "Publish";}
@Html.Hidden("Id", Model.Id)
@using (Html.BeginForm("Grade","Quiz", FormMethod.Post))
{
foreach (var question in Model.Questions){
@Html.Partial("_Question", question, new ViewDataDictionary(){
TemplateInfo = new TemplateInfo()
{ HtmlFieldPrefix = "Questions" }
});
}
<input type="submit" value="Vesturen" />
}
问题
@model QuizApp.Models.Question
<div class="question">
@Html.Hidden("Quiz.Questions[" + Model.OrderNumber + "].Id", Model.Id)
//Shows the question
<b>@Model.Text </b><br/>
//Adds choices to the question
@foreach (var choice in Model.Choices)
{
@Html.Partial("_Choice", choice, new ViewDataDictionary()
{
TemplateInfo = new TemplateInfo()
{ HtmlFieldPrefix = "Choices" }
});
}
</div>
最后选择偏视图
@model QuizApp.Models.Choice
@Html.RadioButton("Quiz.Questions[" + Model.Question.OrderNumber + "].Choices[0].Id", Model.Id)
@Model.Text
有没有人看到我的问题的解决方案,或者是解决方法?我做错了什么,我显然不知道吗?我不明白为什么它总是给我空值,因为据我所知它现在应该可以工作了。
以下将起作用:
for (var i = 0; i < Model.Questions.Count(); i++){
@Html.Partial("_Question", question, new ViewDataDictionary(){
TemplateInfo = new TemplateInfo()
{ HtmlFieldPrefix = "Questions[" + i.ToString() + "]" }
});
}
换句话说,您的字段前缀需要包含索引。另外,索引不能是任意值,就像您尝试使用Model.Question.OrderNumber
。它必须是列表中的实际索引。
或者,如果您按照以下方式创建视图Views\Shared\EditorTemplates\Question.cshtml
:
@model Namespace.To.Question
@Html.HiddenFor(m => m.Id)
...
然后,在您看来,您可以简单地执行以下操作:
@Html.EditorFor(m => m.Questions)
并且Razor将为中的每个项目渲染该编辑器模板Questions
,所有模板都正确加上前缀。冲洗并与您的其他课程重复,例如Choice
等等。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句