2009-01-09 181 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 
}