C# 剃须刀-单选按钮绑定问题

C# 剃须刀-单选按钮绑定问题,c#,asp.net,asp.net-mvc-3,asp.net-mvc-4,razor,C#,Asp.net,Asp.net Mvc 3,Asp.net Mvc 4,Razor,我正在努力为单选按钮绑定ans,我正在做一个小项目。 我有两个问答模式。我想要实现的是拉一个问题列表,根据设置,用户将有多项选择或在文本框中键入答案。使用单选按钮,我似乎无法绑定ans,因为它得到一个空对象。有人能给我指出正确的方向吗 @model List<Question.Models.Questionnaire> @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2&g

我正在努力为单选按钮绑定ans,我正在做一个小项目。 我有两个问答模式。我想要实现的是拉一个问题列表,根据设置,用户将有多项选择或在文本框中键入答案。使用单选按钮,我似乎无法绑定ans,因为它得到一个空对象。有人能给我指出正确的方向吗

@model List<Question.Models.Questionnaire>


@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Question List</h2>

@using(Html.BeginForm("GetAnswer","Home")) {


for(int i = 0;i < Model.Count;i++) {

    <text>@Model[i].Questions</text> <br />

    @Html.HiddenFor(M => M[i].QuestionID)

    if (@Model[i].MultipleChoice == false){

        @Html.TextBoxFor(M => M[i].Response) <br />

    } else {

          for(int j = 0;j < Model[i].GetAns.Count;j++) {
               <div>
              <text>@Model[i].GetAns[j].AnsText</text>
              @Html.RadioButtonFor(M => Model[i].QuestionID, Model[i].GetAns[j].AnswerId) <br />
               </div>
        }

        /*
        foreach(var ansOption in PossibleAns) {
          <div>
           @Html.RadioButtonFor(model => Model[i].QuestionID, ansOption.AnswerId)
           @Html.Label(ansOption.AnsText)
          </div>  
        }
         * */
        <br />
    }
}
<br />

  <input type="submit" name="submit" />
@型号列表
@{
ViewBag.Title=“Index”;
Layout=“~/Views/Shared/_Layout.cshtml”;
}
问题清单
@使用(Html.BeginForm(“GetAnswer”、“Home”)){
for(int i=0;i
@Html.HiddenFor(M=>M[i].QuestionID)
if(@Model[i].MultipleChoice==false){
@Html.TextBoxFor(M=>M[i].Response)
}否则{ 对于(int j=0;jModel[i].QuestionID,Model[i].GetAns[j].AnswerId)
} /* foreach(可能选项){ @Html.radioButton(model=>model[i].QuestionID,ansOption.AnswerId) @Label(ansOption.AnsText) } * */
} }
}

公共课堂调查问卷
{
公众问卷(){
}
public int QuestionID{get;set;}
公共字符串标题{get;set;}
公共字符串问题{get;set;}
公共字符串响应{get;set;}
公共布尔多重切迹{get;set;}
公共列表getan{set;get;}
}
公开课答案
{
public int AnswerId{get;set;}
公共字符串AnsText{get;set;}
公共调查问卷问题{get;set;}
}
公共类问题库
{
公开名单
获取调查问卷(){
列表q=新列表();
q、 添加(新问卷(){
QuestionID=11,Title=“Geo”,Questions=“英格兰首都?”,GetAns=GetAns(),multipleechoice=true
});
q、 添加(新问卷(){
QuestionID=22,Title=“Geo”,Questions=“法国首都”,GetAns=GetAns()
});
q、 添加(新问卷(){
QuestionID=33,Title=“Geo”,Questions=“古巴首都”,GetAns=GetAns()
});
返回q;
}
公共列表GetAns(){
List ans=新列表();
ans.Add(新答案){
AnswerId=1,AnsText=“伦敦”,Ques=新问卷(){
问题ID=11
}
});
ans.Add(新答案){
AnswerId=2,AnsText=“巴黎”,Ques=新问卷(){
问题ID=22
}
});
ans.Add(新答案){
AnswerId=3,AnsText=“哈瓦那”,Ques=新问卷(){
问题ID=33
}
});
返回ans;
}
}

您的单选按钮绑定到属性
问题ID
(并且您用所选的
AnswerID
覆盖
QuestionID
的值,因此在发回时没有任何意义。您的类和属性命名很难理解,但是如果您想从一组可能的答案中选择一个答案,那么属性
GetAns
只需要是
Lis即可。)t
然后将所选答案绑定到属性
响应
。例如,对于第一个问题(“英格兰首都?”),如果您似乎希望选择“伦敦”、“巴黎”或“哈瓦那”,则该问题应具有属性

public List<string> PossibleAnswers { get; set; }
public List PossibleAnswers{get;set;}
在控制器中

model.Questions[0].PossibleAnswers = new List<string>() { "london", "paris", "Havana" }
model.Questions[0]。可能的答案=新列表(){“伦敦”、“巴黎”、“哈瓦那”}
在我看来

for(int i = 0; i < Model.Count; i++) {
{

  if (@Model[i].MultipleChoice)
  {
    // Radio buttons for multiple choice
    foreach(string option in Model[i].PossibleAnswers)
    {
      <label>   
        @Html.RadioButtonFor(m => m[i].Response, option})
        <span>@option</span>
      </label>
    }
  }
  else
  {
    // Textbox for answer
    @Html.TextBoxFor(m => m[i].Response)
  }
}
for(int i=0;im[i]。响应,选项})
@选择权
}
}
其他的
{
//答案文本框
@Html.TextBoxFor(m=>m[i].Response)
}
}
当您发回时,
Response
属性将包含答案的文本,或者包含在文本框中输入的内容,或者包含一个可能的答案(如果是多项选择题)

但是,我建议您需要重新考虑在这里所做的大部分工作,特别是如果您希望绑定到多选答案的ID属性

for(int i = 0; i < Model.Count; i++) {
{

  if (@Model[i].MultipleChoice)
  {
    // Radio buttons for multiple choice
    foreach(string option in Model[i].PossibleAnswers)
    {
      <label>   
        @Html.RadioButtonFor(m => m[i].Response, option})
        <span>@option</span>
      </label>
    }
  }
  else
  {
    // Textbox for answer
    @Html.TextBoxFor(m => m[i].Response)
  }
}