我正在努力绑定单选按钮,我正在做一个小项目。我有两个模型问答。我想获得的是一个问题列表,并根据设置用户将有多种选择或在文本框中键入答案。 使用单选按钮,我似乎无法绑定它得到一个空对象,有人可以指出我正确的方向。
@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
(并且使用所选AnswerID
覆盖QuestionID
的值,因此回发时没有任何意义。您的类和属性命名使其难以理解,但是如果您想从一组可能的答案中选择一个答案,则只需要List<string>
属性GetAns
,然后将所选答案绑定到属性Response
。例如,对于第一个问题("英格兰首都?"),您似乎希望选择"伦敦","巴黎"或"哈瓦那",那么问题应该具有属性
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)
}
}
回发时,Response
属性将包含答案的文本,可以是在文本框中输入的内容,也可以是可能的答案之一(如果是多项选择题)。
但是,我建议您需要重新考虑您在这里所做的大部分工作,特别是如果您想绑定到多项选择答案的 ID 属性。