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

razor - binding issue with radio button

我正在努力为我正在做一个小项目的单选按钮绑定 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" />

}

public class Questionnaire
{
    public Questionnaire() {
    }

    public int QuestionID  { get; set;}
    public string Title    { get; set;}
    public string Questions{ get; set;}
    public string Response { get; set;}
    public bool MultipleChoice { get; set;}

    public List<Answer> GetAns { set; get;}

}

 public class Answer  
 {
    public int AnswerId { get; set; }
    public string AnsText { get;set;}
    public Questionnaire Ques { get; set;}
 }


public class QuestionRepository
{

    public List<Questionnaire>
         GetQuestionnaire() {
             List<Questionnaire> q = new List<Questionnaire>();
             q.Add(new Questionnaire() {
                 QuestionID = 11, Title = "Geo", Questions = "Capital of England?", GetAns = GetAns(), MultipleChoice = true
             });
             q.Add(new Questionnaire() {
                 QuestionID = 22, Title = "Geo", Questions = "Capital of France", GetAns = GetAns()
             });
             q.Add(new Questionnaire() {
                 QuestionID = 33, Title = "Geo", Questions = "Capital of Cuba", GetAns = GetAns()
             });
             return q;
    }

    public List<Answer> GetAns() {

        List<Answer> ans = new List<Answer>();
        ans.Add(new Answer() {
            AnswerId = 1, AnsText = "london", Ques = new Questionnaire() {
                QuestionID = 11
            }
        });
        ans.Add(new Answer() {
            AnswerId = 2, AnsText = "paris", Ques = new Questionnaire() {
                QuestionID = 22
            }
        });
        ans.Add(new Answer() {
            AnswerId = 3, AnsText = "Havana", Ques = new Questionnaire() {
                QuestionID = 33
            }
        });

        return ans;
    }



}

您的单选按钮绑定到 属性 QuestionID(并且您用 selected AnswerID 覆盖了 QuestionID 的值,所以什么都不会当你 post 回来时感觉。你的 class 和 属性 命名使它很难理解,但如果你想 select 从一组可能的答案中选择一个答案,那么属性 GetAns 只需要 List<string> 然后将 select 的答案绑定到 属性 Response。例如,对于第一个问题 ( "Capital of England?") 您似乎希望选择 "london", "paris""Havana",那么问题应该有一个 属性

public List<string> PossibleAnswers { get; set; }

并在控制器中

model.Questions[0].PossibleAnswers = new List<string>() { "london", "paris", "Havana" }

并在视图中

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)
  }
}

当您 post 返回时,Response 属性 将包含答案的文本,可以是在文本框中输入的内容,也可以是可能的答案之一,如果它一道选择题。

但是,我建议您需要重新考虑您在这里所做的大部分工作,尤其是当您想要绑定到多项选择答案的 ID 属性 时。