1

为简单起见,我有一个具有以下属性的模型调查:

class SurveyItem {
    public string Question { get; set; }
    public string SelectedAnswerCode { get; set; }
    public List<Answer> Answers { get; set; }
}

答案是这样的:

class Answer {
    public int AnswerCode { get; set; }
    public string AnswerText { get; set; }
}

Answers 用于构建可能答案的下拉列表框(用户选择一个)

在我的视图中,我使用了一个 IEnumerable 模型,对于每个问题,我都有一个可供选择的答案列表。

我预填充这个集合并传递给我的视图。当我单击提交时,它会返回到控制器进行验证。如果模型无效,我将它传递给同一个视图,让用户像往常一样修复他的答案。

问题- 用于下拉列表的答案集合在我提交时未保留在模型中。我将 HiddenFor、EditorFor 和 DropDownListFor 用于单值属性,但是,如何在模型中保留可能答案的集合?

PS>

谢谢。

PS我正在使用单行代码@Html.DropDownListFor 在我的EditorTemplate 中呈现下拉列表:

@Html.DropDownListFor(model => model.SelectedAnswerCode, 
new SelectList(Model.Answers, "AnswerCode", "AnswerText", 0))
4

3 回答 3

0

This seems to do the trick: http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

Basically in your view do something like this:

@for(int i = 0; i < Model.Answers.Count; i++)
            {
                @Html.Hidden(string.Format("Answers[{0}].AnswerCode", i), Model.Answers[i].AnswerCode)
                @Html.Hidden(string.Format("Answers[{0}].AnswerText", i), Model.Answers[i].AnswerText)

                @Html.RadioButton("SelectedAnswerCode", Model.Answers[i].AnswerCode)
                @Model.Answers[i].AnswerText
            }

EDIT:

Alternatively, you can create your own HtmlHelper extension. For example:

public static class CustomHtmlHelperExtensions
    {
        public static MvcHtmlString HiddenForSurveyAnswers(this HtmlHelper htmlHelper, IEnumerable<Models.Answer> answers)
        {
            var html = new StringBuilder();

            int index = 0;
            foreach (var answer in answers)
            {
                html.AppendLine(htmlHelper.Hidden(string.Format("Answers[{0}].AnswerCode", index), answer.AnswerCode).ToString());
                html.AppendLine(htmlHelper.Hidden(string.Format("Answers[{0}].AnswerText", index), answer.AnswerText).ToString());
                index++;
            }

            return MvcHtmlString.Create(html.ToString());
        }
    }

Then add an @using YourMvcApplicationNamespace to the top of the view and then use the extension like:

@Html.HiddenForSurveyAnswers(Model.Answers)
于 2012-12-11T09:21:35.260 回答
0

使用 MVC,您也可以编写一个编辑器模板来保存Model.Answers:)

保存一个名为Answer.chtml.\Views\Shared\EditorTemplates

添加以下代码:

@model Answer          
@Html.HiddenFor(item => item.AnswerCode) 
@Html.HiddenFor(item => item.AnswerText)

然后在你原来的视图中,添加它:

@Html.EditorFor(model => model.Answers)
@Html.DropDownListFor(model => model.SelectedAnswerCode, new SelectList(Model.Answers, "AnswerCode", "AnswerText", 0))

通过这种方式,您不必担心编写foreach语句或担心它们的 ID。希望能帮助到你。

于 2013-08-30T08:00:23.337 回答
0

您需要添加virtual到 Answers 声明。

class SurveyItem {
    public string Question { get; set; }
    public string SelectedAnswerCode { get; set; }
    public virtual List<Answer> Answers { get; set; }
}
于 2012-12-10T23:09:23.883 回答