2012-08-31 107 views
1

我刚刚陷入一团乱麻,无法自拔。我有以下的域模型(减少简洁):MVC 3复杂模型绑定

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我使用EditorTemplates每个QuestionGroupQuestion。在渲染我的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> 

我已经产生了自定义模型绑定但是这是我有点卡住了。我的实际问题是:

  1. 如何在视图中基于我的域模型持续选择的值?
  2. 我甚至对这样的事情使用正确的方法,还是我的方式?

我必须承认,我仍然非常处于MVC的学习阶段,所以我可能因为自己的尝试而有点盲目。任何帮助总是感激!

+4

不要混淆使用,以显示视图的模型,并用于获取结果的模型 - 这些_can_(和可能_应该不同)。请参阅Dino的[三种ASP.NET MVC应用程序模型](http://www.simple-talk.com/dotnet/asp.net/the-three-models-of-asp.net-mvc-apps/)埃斯波西托。 – Oded

+0

@Oded:有趣的是,我确实考虑使用视图模型作为代理,但试图通过使我的表示层直接与域模型一起工作来尽量减少我的代码 - 我同意这是例外而非规则,但它适用于我到目前为止。 –

回答

1

你应该有你的数据库实体和视图之间的视图模型。如果你想添加例如。验证它会在你的db类中使用验证属性非常麻烦。 从长远来看,viewmodels将为您节省时间。