我正在尝试创建一个调查表,以后可以保存并重新访问它,现在用户可以以序列化类的形式保存进入db的值,然后由控制器检索这些值(如果存在)并添加到视图模型中。
调查中的每个问题都有5个可能的答案,这些问题是使用视图模型内列表中的foreach循环生成的。
我要弄清楚的是如何做到这一点,以便如果保存的答案的视图模型列表不为null,则自动检查与数据库中保存的值相对应的单选按钮。
我环顾了与此类似的其他帖子,它们仅处理是/否按钮,但是我需要它比较Model.SavedAnswers [i] .Value中的单选按钮值,并检查是否同样,这可能吗?
下面关于生成问题的foreach结构的示例代码。保存的值存储在一个List中,AnswerModel包含一个称为value的属性,该属性将与单选按钮的值进行比较。
@foreach (Question m in Model.Questions)
{
<tr style="background-color: #f1f1f1">
<td colspan="5">
@count @m.QuestionText
@Html.Hidden("Answers[" + (count - 1) + "].QuestionNumber", m.QuestionNumber)
</td>
</tr>
<tr style="background-color: #fff">
<td>
@Html.Label("Strongly Agree")
@Html.RadioButton("Answers[" + (count - 1) + "].Value", "0", new { id = m.QuestionNumber })
</td>
<td>
@Html.Label("Agree")
@Html.RadioButton("Answers[" + (count - 1) + "].Value", "1", new { id = m.QuestionNumber })
</td>
<td>
@Html.Label("Neither agree nor disagree")
@Html.RadioButton("Answers[" + (count - 1) + "].Value", "2", new { id = m.QuestionNumber })
</td>
<td>
@Html.Label("Disagree")
@Html.RadioButton("Answers[" + (count - 1) + "].Value", "3", new { id = m.QuestionNumber })
</td>
<td>
@Html.Label("Strongly Disagree")
@Html.RadioButton("Answers[" + (count - 1) + "].Value", "4", new { id = m.QuestionNumber })
</td>
<td>
@Html.Label("Don't Know")
@Html.RadioButton("Answers[" + (count - 1) + "].Value", "5", new { id = m.QuestionNumber })
</td>
</tr>
<tr class="separator" />
count++;
}
答案 0 :(得分:0)
查看您的代码,我假设这是Question
public class Question
{
public int QuestionNumber { get; set; }
public int? Value { get; set; }
}
实际上,您需要的是另一个属性来跟踪先前的值,您可以将其与在控制器中获取帖子时进行比较,例如:
public class Question
{
public int QuestionNumber { get; set; }
public int? Value { get; set; }
public int? PreviousValue { get; set; }
}
然后在您的视图文件中,您将需要一个隐藏字段,以确保当表单回发到控制器时,当前值将绑定为先前的值,如下所示:
@Html.Hidden("Answers[" + (count - 1) + "].PreviousValue", m.Value)
这就是您所需要的,但是当您的视图呈现单选按钮始终为空(即不反映当前值)时,您可能会发现有些奇怪。这是因为在您的所有@Html.RadioButton()
中,您没有将另一个重载用于RadioButton(string name, object value, bool isChecked)
。因此,您将需要更改所有@Html.RadioButton()
以包括第三个参数,该参数指示在单选按钮为true时将被选中。示例:
@Html.RadioButton("Answers[" + (count - 1) + "].Value", "0", new { id = m.QuestionNumber }, m.Value == 0)
当第三个参数m.Value == 0
返回true时,该复选框将显示为选中状态。