MVC 3复杂模型绑定

时间:2012-08-31 12:24:41

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

我只是陷入了一点混乱,我很难想象自己。我有以下域模型(为简洁而简化):

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时,我正在为每个QuestionGroupQuestion使用 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"
};

然后我们最终得到这个:

enter image description here

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 ,但这是我有点卡住的地方。我的实际问题是:

  1. 如何在视图中根据我的域模型保留所选值?
  2. 我甚至使用正确的方法来做这样的事情,还是我离开了?
  3. 我必须承认,我仍然处于MVC的学习阶段,所以我可能会因为自己的尝试而有点盲目。任何帮助总是赞赏!

2 个答案:

答案 0 :(得分:1)

您的数据库实体和视图之间应该有一个viewmodel。如果你想加入ex。验证在db类上使用验证属性会变得相当混乱。 从长远来看,viewmodels将节省您的时间。

答案 1 :(得分:1)

使用我提出的另一个问题中提到的自定义模型绑定器来解决此问题:https://stackoverflow.com/a/12318484/961328