1

私はこのビューをレンダリングフォームに持っています

@using ExpertApplication.ViewModels
@model IEnumerable<QuestionViewModel>
@{
    ViewBag.Title = "GetQuestions";
}
@using(Html.BeginForm("ProcessAnswers", "Home", FormMethod.Post))
{
    foreach(QuestionViewModel questionViewModel in Model)
    {
        Html.RenderPartial("QuestionPartialView", questionViewModel);
    }
<input type="submit" value="Send data"/>
}
}
<h2>GetQuestions</h2>

そして部分的なビュー

@using ExpertApplication.ViewModels
@model QuestionViewModel
<div id="question">
    @Model.Text
    <br />
    <div id="answer">
        @foreach(var answer in Model.AnswerViewModels)
        {
            @(Model.IsMultiSelected
            ? Html.CheckBoxFor(a => answer.Checked)
            : Html.RadioButtonFor(a => answer.Checked, false))
            @Html.LabelFor(a => answer.Text)
            <br />
        }
    </div>
</div>

Fromからデータを取得したい

[HttpPost]
public ActionResult ProcessAnswers(IEnumerable<QuestionViewModel> answerForQuesiton)
{
//answerForQuestion always is null
}

ただし、パラメーターanswerForQuesitonはnullです。この問題を解決する方法は?

4

2 に答える 2

1

間違ったメカニズムを使用しています。部分ビューではなく、EditorTemplates を使用する必要があります。エディター テンプレートは、コレクションを処理し、適切にフォーマットされた名前属性を作成する方法を知っているため、ポストバックにバインドできます。

http://coding-in.net/asp-net-mvc-3-how-to-use-editortemplates/

于 2012-04-30T00:06:01.770 に答える
1

MVC は、ゼロのインデックス名を使用してリストをバインドします。残念ながら、この理由から、foreachループは正しい値を含む入力を作成しますが、正しい名前を使用する入力名を作成しません。したがって、次を使用してリストをバインドすることはできませんforeach

例えば:

for (int i = 0; i< Model.Foo.Count(); i++)
{
    for (int j = 0; j < Model.Foo[i].Bar.Count(); j++)
    {
        @Html.TextBoxFor(m => m.Foo[i].Bar[j].myValue)
    }
}

「Foo[1].Bar[2].myValue」のような名前のテキスト ボックスを作成し、正しくバインドします。でも、

foreach (var foo in Model.Foo)
{
    foreach (var bar in foo.Bar)
    {
        @Html.TextBoxFor(m => bar.myVal);
    }   
}

前のループとまったく同じ値のテキスト ボックスが作成されますが、それらはすべて "name="bar.myVal" を持つため、いずれもバインドできません。

したがって、問題を解決するには:
1) foreach ループを for ループに置き換えることができます。注: これには、2の代わりにIListorを使用する必要 があります) 正しい名前を自動的に適用する EditorTemplates を使用できます。ListIEnumerable

于 2012-04-30T00:46:20.490 に答える