2009-01-09 180 views
6

我正在构建一个调查问卷mvc webapp,并且我无法弄清楚如何从窗体向控制器传递未知数量的参数。Asp.Net MVC形式,具有未知参数的控制器

我的形式是一样的东西:

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

现在我需要在我的控制器列表< ResponseAnswer>, 其中ResponseAnswer具有的属性:

串questionID, 串AnswerText, 布尔AnswerBool, number Answer Number, ...

那么我怎么能通过一个未知的包含问题ID,答案类型和对控制器的答案的n个项目。 在webforms中,我通过渲染带有repeater而不是foreach的表单来解决此问题,然后遍历问题重复器检查控件ID,每个包含隐藏questionid元素和id = AnswerType的输入的Repeater项。 但这会严重破解mvc中关注的分离?

那么,有没有让我的控制器接受列表< ResultAnswer>并以某种方式建立这个名单没有打破SOC的任何方式,如果没有,我如何通过整个formresult回控制器,所以我可以做的迭代表单数据在那里而不是在视图中。

回答

2

加里的回答就可以了(因此,高达投票)。但是,您可以将绑定直接建模到列表,并且我认为它更优雅。 There are instructions in this blog post.

+0

华友世界,有人拼写我的名字是正确的! – 2009-01-09 14:23:03

9

您可以将参数添加到你的动作像

public ActionResult MyAction(FormCollection form) 

然后form参数将包含在提交的表单中的所有数据。从那你可以做你想做的。

你或许可以实现一个可映射到ResponseAnswers的活页夹,但我没有这样做的经验,所以我会把它留给其他人。

2

澄清Gary的答案,那么你可以轻松地穿行形式的所有领域这样

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

    //do something 
}