我只是陷入了一点混乱,我很难想象自己。我有以下域模型(为简洁而简化):
public class Questionnaire
{
public int Id { get; set; }
public IList<QuestionGroup> QuestionGroups { get; set; }
}
public class QuestionGroup
{
public int Id { get; set; }
public string Name { get; set; }
public int Order { get; set; }
public IList<Question> Questions { get; set; }
}
public class Question
{
public int Id { get; set; }
public string Text { get; set; }
public string Type { get; set; }
public string Headings { get; set; }
public IList<Answer> Answers { get; set; }
}
public class Answer
{
public int Id { get; set; }
public string Text { get; set; }
}
现在,当我在我的视图中呈现Questionnaire
时,我正在为每个QuestionGroup
和Question
使用 EditorTemplates 。渲染我的Question
时,我正在查看Type
属性(类似于RadioButtonList或TextArea)和每个Heading
(这是一个以逗号分隔的字符串)。例如,假设我们初始化为Question
,如此:
var question = new Question() {
Text = "My Question Text",
Type = "RadioButtonList",
Headings = "Very Difficult,2,3,4,Very Easy"
};
然后我们最终得到这个:
在 EditorTemplate 中生成的内容如下:
@foreach (var heading in Model.Headings.Split(','))
{
<li>
<div>
<strong>@heading</strong>
@Html.RadioButton(Model.Id.ToString(), heading)
</div>
</li>
}
这个标记如下:
<ul>
<li>
<div>
<strong>Very Difficult</strong>
<input id="group_question_1" name="group.question.1" type="radio" value="Very Difficult" />
</div>
</li>
<li>
<div>
<strong>2</strong>
<input id="group_question_1" name="group.question.1" type="radio" value="2" />
</div>
</li>
<li>
<div>
<strong>3</strong>
<input id="group_question_1" name="group.question.1" type="radio" value="3" />
</div>
</li>
<li>
<div>
<strong>4</strong>
<input id="group_question_1" name="group.question.1" type="radio" value="4" />
</div>
</li>
<li>
<div>
<strong>Very Easy</strong>
<input id="group_question_1" name="group.question.1" type="radio" value="Very Easy" />
</div>
</li>
</ul>
我制作了一个自定义模型Binder ,但这是我有点卡住的地方。我的实际问题是:
我必须承认,我仍然处于MVC的学习阶段,所以我可能会因为自己的尝试而有点盲目。任何帮助总是赞赏!
答案 0 :(得分:1)
您的数据库实体和视图之间应该有一个viewmodel。如果你想加入ex。验证在db类上使用验证属性会变得相当混乱。 从长远来看,viewmodels将节省您的时间。
答案 1 :(得分:1)
使用我提出的另一个问题中提到的自定义模型绑定器来解决此问题:https://stackoverflow.com/a/12318484/961328