Передача данных в метод Controller через POST

У меня есть страница «Опрос», которая объявлена ​​​​следующим образом:

@using (Html.BeginForm("Survey", "Home", new { questionList = Model.Questions }, FormMethod.Post))
{
    <div class="survey">
        <ol class="questions">
            @foreach (Question q in Model.Questions)
            {
                <li class="question" id="@q.QuestionName">
                    @q.QuestionText<br />
                    @foreach (Answer a in q.Answers)
                    {
                        <input class="answer" id="@a.DisplayName" type="checkbox" /><label for="@a.DisplayName">@a.AnswerText</label>
                        if (a.Expandable)
                        {
                        <input type="text" id="@a.DisplayNameFreeEntry" maxlength="250" /> <span>(250 characters max)</span>
                        }
                        <br />
                    }
                </li>
            }
        </ol>
    </div>
    <div class="buttons">
        <input type="submit" value="Finish" />
    </div>
}

Когда я просматриваю свой код, он попадает в метод, который я настроил для обработки их опроса:

[HttpPost]
public ActionResult Survey( List<Question> questionList, FormCollection postData)
{
     //Process Survey
}

Однако, когда я делаю шаг, я обнаруживаю, что переменная questionList имеет значение null, а переменная postData не содержит никаких данных из формы. Попытка получить доступ к флажкам через Request[a.Displayname тоже не работает.

Все, что я прочитал, указывает на то, что это правильный способ сохранения значений из модели в метод отправки, и что таким образом я должен иметь доступ к FormCollection.

Что я делаю неправильно?


person Jeff    schedule 12.07.2013    source источник
comment
Вы можете увидеть этот haacked.com/archive/ 2008/10/23/model-binding-to-a-list.aspx и этот stackoverflow.com/questions/5496593/   -  person Tassadaque    schedule 13.07.2013


Ответы (3)


Вы должны сохранить список вопросов как скрытое поле на странице. Непримитивные типы не сохраняются просто путем их передачи.

Один из способов сделать это

@Html.HiddenFor(m => m.Foo)

Или вы можете сделать это прямо в HTML, как это

<input type="hidden" name="Var" value="foo">

где m - ваша модель.

person Sachin Kainth    schedule 12.07.2013
comment
Я новичок в отображении MVC. Как сохранить список вопросов как скрытое поле? - person Jeff; 13.07.2013

Тот факт, что postData пуст, странен, поскольку каждый элемент ввода с идентификатором внутри тега формы должен передаваться с запросом POST.

Но questionList не будет получен таким образом, поскольку это список сложного класса (а не просто строка или целое число) и ModelBinder по умолчанию (вещь, которая превращает переменные HTTP-запроса в параметры, передаваемые методу действия) не t поддерживает списки сложных классов.

Если вы хотите иметь возможность получать список, вам придется реализовать собственный механизм привязки с помощью CustomModelBinder.

Эта статья поможет вам это реализовать.

person Aviran Cohen    schedule 12.07.2013

Одна из проблем заключается в том, что ваш флажок и ваше текстовое поле не привязаны должным образом к вашей модели.

Вы должны использовать @Html.CheckBoxFor и @Html.TextBoxFor

person EkoostikMartin    schedule 12.07.2013