2009-01-09 24 views
6

Estoy construyendo un cuestionario mvc webapp, y no puedo entender cómo pasar una cantidad desconocida de argumentos al controlador desde el formulario.Asp.Net formulario MVC, con parámetros desconocidos para el controlador

Mi forma es algo así como:

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

Ahora lo que necesito en mi controlador está lista < ResponseAnswer>, donde ResponseAnswer tiene las propiedades:

cadena IdPregunta, cadena answerText, bool AnswerBool, número AnswerNumber, ...

Entonces, ¿cómo puedo pasar un desconocido n cantidad de elementos que contienen questionID, AnswerType y Answer para el controlador. En webforms resolví esto al representar el formulario con repetidores en lugar de foreach, y luego iterando a través del repetidor de preguntas comprobando el ID de control, cada elemento repetidor que contiene un elemento questionid oculto y una entrada con id = AnswerType. ¿Pero esto romperá seriamente la separación de la preocupación en mvc?

Entonces, ¿hay alguna manera de hacer que mi controlador acepte List < ResultAnswer> y de alguna manera compilar esta lista sin romper soc, y si no, cómo paso todo el resultado de vuelta al controlador para que pueda hacer la iteración de los datos de formulario allí en lugar de en la vista.

Respuesta

2

de Garry funcionará (y por lo tanto, un aumento votaron). Sin embargo, puede modelar el enlace directamente a una lista, y creo que es un poco más elegante. There are instructions in this blog post.

+0

¡Hurra, alguien deletreó mi nombre correcto! –

+0

Voto ascendente también para el enlace, sabía que había visto algo en alguna parte –

+0

El enlace no funciona. ¿Puedes proporcionar una muestra de código? Es la forma sugerida de responder en SO. – Mahmoodvcs

9

Se puede añadir un argumento a su acción como

public ActionResult MyAction(FormCollection form) 

A continuación, el parámetro form contendrá todos los datos del formulario publicado. De eso puedes hacer lo que quieras.

Probablemente pueda implementar una carpeta que pueda asignarse a ResponseAnswers pero no tengo experiencia en hacerlo así que se lo dejo a otra persona.

2

Para aclarar la respuesta de Gary, a continuación, puede caminar fácilmente a través de todos los campos del formulario como respuesta este

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

    //do something 
} 
Cuestiones relacionadas