这是我的viewmodel
public class UserResponseModel
{
public string QuestionId { get; set;}
public string QuestionText { get; set; }
public bool IsChecked { get; set; }
}
所以,对于复选框,这可以很好地工作
for (var i = 0; i < Model.UserResponses.Count; i++)
{
<div class="row">
<div class="col-md-4">
<div class="form-group">
@Html.HiddenFor(x => x.UserResponses[i].QuestionId)
@Html.CheckBoxFor(x => x.UserResponses[i].IsChecked)
但是对于单选按钮,这不是
for (var i = 0; i < Model.UserResponses.Count; i++)
{
<div class="row">
<div class="col-md-4">
<div class="form-group">
@Html.HiddenFor(x => x.UserResponses[i].QuestionId)
@Html.RadioButtonFor(x => x.UserResponses[i].IsChecked, new { Name = "grp1" })
@Html.DisplayTextFor(x => x.UserResponses[i].QuestionText)
当我提交表格时,IsChecked总是假的 - 为什么 - 我错过了什么 - 就像我提到的复选框一样,它工作得很好。我确实看过这个问题here,但我不确定为什么单选按钮在视图模型中需要额外的属性才能在复选框透明地工作时保持正确的答案。
编辑:我的问题模型现在就是这样
public class QuestionModel
{
public string WhichQuestion { get; set; }
public int PointsObtained { get; set; }
public bool CorrectAnswer { get; set; }
private List<UserResponseModel> _userResponse;
public List<UserResponseModel> UserResponses
{
get { return _userResponse ?? (_userResponse = new List<UserResponseModel>()); }
set { _userResponse = value; }
}
}
注意我刚添加了公共bool CorrectAnswer {get;组; }
在我看来这是代码
for (var i = 0; i < Model.UserResponses.Count; i++)
{
<div class="row">
<div class="col-md-4">
<div class="form-group">
@Html.HiddenFor(x => x.UserResponses[i].QuestionId)
@Html.HiddenFor(x => x.CorrectAnswer)
@Html.HiddenFor(x => x.UserResponses[i].IsChecked)
@Html.RadioButtonFor(x => x.UserResponses[i].IsChecked, Model.CorrectAnswer, new { Name = "grp1" })
编辑2:
@Html.HiddenFor(x => x.UserResponses[i].QuestionId)
@Html.HiddenFor(x => x.SelectedAnswerId)
@Html.HiddenFor(x => x.UserResponses[i].IsChecked)
@Html.RadioButtonFor(x => x.UserResponses[i].IsChecked, Model.SelectedAnswerId, new { Name = "grp1" })
EDIT3:
public class QuestionModel
{
public string WhichQuestion { get; set; }
public int PointsObtained { get; set; }
private List<UserResponseModel> _userResponse;
public List<UserResponseModel> UserResponses
{
get { return _userResponse ?? (_userResponse = new List<UserResponseModel>()); }
set { _userResponse = value; }
}
}
public class UserResponseModel
{
public string QuestionId { get; set;}
public string QuestionText { get; set; }
public string SelectedQuestionId { get; set; }
}
最后,我的观点
for (var i = 0; i < Model.UserResponses.Count; i++)
{
<div class="row">
<div class="col-md-4">
<div class="form-group">
@Html.HiddenFor(x => x.UserResponses[i].QuestionId)
@Html.RadioButtonFor(x => x.UserResponses[i].SelectedQuestionId, Model.UserResponses[i].QuestionId, new { Name = "grp1" })
@*@Html.CheckBoxFor(x => x.UserResponses[i].IsChecked)*@
@Html.DisplayTextFor(x => x.UserResponses[i].QuestionText)
编辑4:所以最后我得到了一些地方
这工作!!!
@Html.RadioButtonFor(x => x.UserResponses[i].SelectedQuestionId, Model.UserResponses[i].QuestionId)
我现在可以在我的httppost方法中看到selectquestionid,但是如果我这样做
@Html.RadioButtonFor(x => x.UserResponses[i].SelectedQuestionId, Model.UserResponses[i].QuestionId, new {Name="grp"})
然后虽然我只能选择一个单选按钮,但httpppost上的selectedquestionid 为null - wierd
答案 0 :(得分:4)
单选按钮不是复选框。单选按钮被分组。这意味着您应该在视图模型上具有单个属性来保存选定的单选按钮值(如answer you linked to
中所示)。使用复选框,您可以选择多个复选框,这就是您将它们绑定到视图模型中的一组布尔值。另一方面,单选按钮只有一个可能的选择值,因为它们是互斥的。这就是为什么它们都应该绑定到视图模型上的一个属性,该属性将保存所选的单选按钮值。
因此,在您的问题和答案示例中,您有一个问题视图模型,其中包含问题ID和文本以及可能的答案列表。每个答案将由id和文本表示。您的问题视图模型还将具有answer属性,该属性将保留用户选择的答案单选按钮。您要将所有单选按钮绑定到此属性。但是价值不同。