Форма Asp.Net MVC с неизвестными параметрами для контроллера - PullRequest
6 голосов
/ 09 января 2009

Я создаю анкету mvc webapp и не могу понять, как передать неизвестное количество аргументов контроллеру из формы.

Моя форма похожа на:

<% using (Html.BeginForm())
   { %>
<div id="Content">
    <% foreach (var group in ViewData.Model.QuestionGroups)
       { %>
    <div class="Group">
        <%=group.Description %>
        <% foreach (var question in group.Questions)
           {%>
        <div class="Question">
            <div class="QuestionTitle">
                <%=question.Title %>
            </div>
                <%=Html.Hidden("Id", question.ID) %>
            <div class="QuestionText">
                <%switch (question.TypeAsEnum)
                  {
                      case QuestionTypeEnum.Text:%>
                <%=Html.TextBox("somename") %>
                <% break;
                      case QuestionTypeEnum.Number:%>
                <%=Html.TextBox("somename") %>
                <% break;
                      case QuestionTypeEnum.PhoneNumber:%>
                <%=Html.TextBox("somename")%>
                <% break;
                      case QuestionTypeEnum.Email:%>
                <%=Html.TextBox("somename")%>
                <% break;
                      case QuestionTypeEnum.Date:%>
                <%=Html.TextBox("somename")%>
                <% break;
                      case QuestionTypeEnum.YesNo:%>
                <%=Html.RadioButton("somename", true)%>
                <%=Html.RadioButton("somename", false)%>
                <% break;
                      case QuestionTypeEnum.Alternative:%>
                <%=Html.DropDownList("somename", question.Answers)%>
                <% break;
                  }%>
            </div>
        </div>
        <% } %>
    </div>
    <% } %>
</div>
<div id="submittButton">
    <%=Html.SubmitButton()%></div>
<% } %>

Теперь, что мне нужно в моем контроллере, это List , где ResponseAnswer имеет свойства:

строка questionID, строка AnswerText, bool AnswerBool, номер AnswerNumber, ...

Так как я могу передать неизвестное количество элементов, содержащих questionID, AnswerType и Answer, в контроллер. В веб-формах я решил эту проблему путем рендеринга формы с повторителями вместо foreach, а затем итерацией по повторителю вопроса, проверяющему контрольный идентификатор, каждый элемент повторителя содержит скрытый вопросительный элемент и вход с id = AnswerType. Но это серьезно сломает разделение концерна в mvc?

Так есть ли способ заставить мой контроллер принять List и каким-то образом построить этот список, не нарушая soc, и если нет, то как мне передать весь formresult обратно в контроллер, чтобы я мог выполнить итерацию данные формы там, а не в виде.

Ответы [ 3 ]

10 голосов
/ 09 января 2009

Вы можете добавить аргумент к вашему действию как

public ActionResult MyAction(FormCollection form)

Тогда параметр form будет содержать все данные из размещенной формы. Из этого вы можете делать то, что вы хотите.

Возможно, вы могли бы внедрить связыватель, который мог бы отображаться в ResponseAnswers, но у меня нет такого опыта, поэтому я оставлю это кому-то другому.

2 голосов
/ 09 января 2009

Ответ Гарри сработает (и, следовательно, проголосовал). Тем не менее, вы можете связать модель напрямую со списком, и я думаю, что это немного элегантнее. В этом сообщении есть инструкции.

2 голосов
/ 09 января 2009

Чтобы уточнить ответ Гэри, вы можете легко пройти через все поля формы, как это

foreach (string s in Request.Form.Keys)
{
    if (s.Contains("number"))
        number = int.Parse ((Request.Form[s]));

    //do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...