1

簡単にするために、次のプロパティを持つモデル調査があります。

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

Answerは次のようになります。

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

Answersは、(ユーザーが1つ選択した)可能な回答のドロップダウンリストボックスを作成するために使用されます。

私のビューでは、IEnumerableのモデルを使用しています。ここでは、質問ごとに、選択できる回答のリストがあります。

このコレクションを事前に入力して、ビューに渡します。[送信]をクリックすると、検証のためにコントローラーに戻ります。モデルが有効でない場合は、通常どおり、ユーザーが回答を修正できるように、モデルを同じビューに渡します。

質問-ドロップダウンリストに使用される回答コレクションは、送信時にモデルに保存されません。単一値のプロパティにHiddenFor、EditorFor、DropDownListForを使用していますが、モデルに可能な回答のコレクションを保持するにはどうすればよいですか?

PS>

ありがとう。

PS私はEditorTemplateでドロップダウンをレンダリングするために単一行コード@Html.DropDownListForを使用しています:

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

3 に答える 3

0

これはトリックを行うようです: http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

基本的にあなたの見解では、次のようなことをしてください:

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

編集:

または、独自の HtmlHelper 拡張機能を作成することもできます。例えば:

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

次に @using YourMvcApplicationNamespace をビューの上部に追加し、次のような拡張子を使用します。

@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

virtualAnswers 宣言に追加する必要があります。

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 に答える