2014-09-04 2 views
0

J'ai recherché des questions similaires ici mais je n'ai toujours pas trouvé de solution à mon problème.Passage de données à partir du formulaire avec un nombre variable d'entrées - MVC 5

J'ai une page qui contient un texte et une forme et ils partagent le même ViewModel comme suit:

public class MyViewModel 
{ 
    public IEnumerable<WordingB> WordingBs { get; set; } 
    public IEnumerable<WordingC> WordingCs { get; set; } 
    public IEnumerable<Question> Questions { get; set; } 
} 

est ici un peu plus de détails sur WordingB, WordingC et Question:

public class WordingB 
    {   
     public string EOW { get; set; } 
    } 



public class WordingC 
    {   
     public string EOW { get; set; } 
    } 




public class Question 
    {   
     public string QuestionText { get; set; } 
     public string Answer {get; set;} 
    } 

Et voici la page en question:

@model MyProject.ViewModels.MyViewModel 

<div class="col-md-6 masonry listview-block"> 
    @foreach (var wording in Model.WordingBs) 
    { 
     <div class="block">     
      <p>@Html.Raw(@wording.EOW)</p> 
     </div> 
    } 
    @foreach (var wording in Model.WordingCs) 
    { 
     <div class="block">    
      <p>@Html.Raw(@wording.EOW)</p> 
     </div> 
    } 

</div> 


@using (Ajax.BeginForm("Routing", "Partials", new AjaxOptions { UpdateTargetId = "Target", LoadingElementId = "spinner", HttpMethod = "POST", InsertionMode = InsertionMode.Replace })) 
{ 


      <div id="quick-post" class="block-body form-validation"> 
       @foreach (var question in Model.Questions) 
       { 
        <div class="form-group"> 
         <label for="QuestionText">@question.QuestionText</label> 
         <input type="text" class="form-control input-sm input-sm" name="Answer"> 
        </div> 
       } 
       <div class="form-group"> 
        <label for="postcode">PostCode</label> 
        <input type="text" class="form-control input-sm validate[required] input-sm" name="postcode" [email protected]["postcode"]> 

       </div> 

       <div class="form-group"> 
        <label>Loss Description</label> 
        <textarea></textarea> 
       </div> 

       <input type="submit" class="btn btn-primary btn-xs" value="Route"> 

      </div> 

     </div> 
    </div> 

} 

l'idée est qu'une personne Admin est un ble d'ajouter des questions au formulaire. (Les questions sont stockées dans une table) Il y a un contrôleur qui utilise MyViewModel et retourne le modèle dont j'ai besoin pour la vue. Le problème auquel je fais face maintenant est de transmettre les données de mon formulaire à un contrôleur. Le formulaire peut avoir zéro à 30 ou 40 questions en ce qui me concerne! J'ai l'impression d'avoir atteint la limite de mes connaissances et j'ai sérieusement besoin de conseils.

+0

duplication possible de [formulaire ASP.NET MVC traitant nombre inconnu d'entrées] (http://stackoverflow.com/questions/4389214/asp-net-mvc-form-handling-unknown-number-of-inputs) –

+0

Quel est exactement votre question? Quel est le problème que vous essayez de résoudre? –

+0

Salut désolé de ne pas être très clair. Ce que je voudrais accomplir est de prendre tout dans ma forme (étiquettes et textareas) et les réafficher dans une autre page. Je ne peux pas le faire du côté du navigateur car les données doivent être vérifiées par rapport à ma base de données. Comme vous pouvez le voir, j'ai un nombre variable de questions (par conséquent aussi des réponses). – Ouanixi

Répondre

5

Avec l'aide de Cosset et Derek, j'ai réussi à trouver une solution de contournement comme suit:

1) je lui ai donné un nom à mon élément d'entrée comme ceci:

<input type="text" name="Answer"> 

Je n'ai pas eu besoin d'itérer avec Answer [i] comme suggéré sur l'une des réponses car le framework lie automatiquement toutes les entrées ayant le même nom dans un élément List que ma méthode peut prendre en argument. Comme ceci:

public ActionResult Routing(List<string> Answer){} 

2) J'ai aussi besoin d'utiliser la valeur de mes étiquettes d'étiquettes dans ma méthode de routage et n'a eu aucune idée de comment le faire. Encore une fois, Cosset a suggéré que j'utilise un champ caché et lui donne une valeur du texte de l'étiquette. Cela a fonctionné parfaitement.

<label for="Answer">@question.QuestionText</label> 
<input type="hidden" name="QuestionText" [email protected] /> 

Et la méthode ressemble maintenant à ceci:

public ActionResult Routing(List<string> Answer, List<string> QuestionText){} 

Maintenant, j'ai ce que je devais.Transmettre toutes les données de mon formulaire au contrôleur (étiquettes et entrées) sans avoir à se soucier du MyViewModel. Par souci d'apprendre, j'aimerais bien savoir s'il existe d'autres moyens d'y parvenir.

1

Ce que vous devez faire est de créer une méthode de retour qui se lie au ViewModel dans la vue afin que l'infrastructure MVC renvoie les données du modèle pour vous.

La méthode ressemblerait à quelque chose comme ça

[Post] 
public ActionResult EOW(MyViewModel viewModel) 
    { 
     //Do something 
     return View(); 
    } 
0

À la première utilisation des aides Html

@{int i = 0;} 
@foreach (var question in Model.Questions) 
      { 
       <div class="form-group"> 
        <label for="QuestionText">@question.QuestionText</label> 
        <input type="text" class="form-control input-sm input-sm" name="Answer[i]"> 
       </div> 
i++; 
      } 

Et ViewModel

public class Question 
{   
    public string QuestionText { get; set; } 
    public IEnumerable<string> Answer {get; set;} 
} 

Et lire des tutoriels

1 2 3

+0

Merci beaucoup pour cela, il m'a en fait indiqué la bonne direction. Le problème auquel je suis confronté maintenant est de transmettre la valeur de mes étiquettes à mon contrôleur! Je serais très reconnaissant si vous pouviez aider. – Ouanixi

+0

Ajouter sous chaque étiquette champ caché.La valeur de ce champ doit être égale à l'étiquette texte – cosset

+0

Vous êtes une étoile, merci beaucoup pour votre aide. – Ouanixi

Questions connexes