2017-01-10 1 views
0

J'ai un modèle objet et je le passe à la vue afin que l'utilisateur puisse entrer ses commentaires pour certaines des propriétés de l'objet dans le cadre d'une enquête.Comment renvoyer une liste d'objets au contrôleur dans MVC

Je peux recevoir ce que l'utilisateur a saisi pour un objet si je ne restitue qu'un seul objet à la vue. Toutefois, lorsque je veux rendre plusieurs (une liste) d'objets à la vue, je reçois une liste d'objets nulle lorsque l'utilisateur clique sur le formulaire de soumission.

S'il vous plaît voir mon code ci-dessous:

Ceci est mon modèle d'objet

public class SurveyViewModel 
{ 
    public string Name { get; set; } 
    public double PV { get; set; } 
    public double QtyUsePerMonth { get; set; } 
    public double TotalPVPerMonth { get; set; } 
} 

Ceci est mon point de vue où je rends la liste des objets

@model IEnumerable<WebApplication4.Models.SurveyViewModel> 
 
@{ 
 
    ViewBag.Title = "Survey"; 
 
} 
 
<h2>Survey</h2> 
 
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "form1" })) 
 
{ 
 
    <table class="table"> 
 
     <tr> 
 
      <th> 
 
       @Html.DisplayNameFor(model => model.Name) 
 
      </th> 
 
      <th> 
 
       @Html.DisplayNameFor(model => model.PV) 
 
      </th> 
 
      <th> 
 
       @Html.DisplayNameFor(model => model.QtyUsePerMonth) 
 
      </th> 
 
      <th> 
 
       @Html.DisplayNameFor(model => model.TotalPVPerMonth) 
 
      </th> 
 
      <th></th> 
 
     </tr> 
 

 
     @foreach (var item in Model) 
 
     { 
 
      <tr> 
 
       <td> 
 
        @Html.DisplayFor(modelItem => item.Name) 
 
        @Html.HiddenFor(modelItem => item.Name) 
 
       </td> 
 
       <td> 
 
        @Html.DisplayFor(modelItem => item.PV) 
 
        @Html.HiddenFor(modelItem => item.PV) 
 
       </td> 
 
       <td> 
 
        @Html.TextBoxFor(modelItem => item.QtyUsePerMonth) 
 
       </td> 
 
       <td> 
 
        @Html.TextBoxFor(modelItem => item.TotalPVPerMonth) 
 
       </td> 
 
      </tr> 
 
     } 
 
    </table> 
 

 
    <input type="submit" value="Submit"> 
 
}

Et ceci est ma méthode HttpPostLorsque l'utilisateur clique sur le bouton Soumettre, j'ai une valeur null pour le modèle où je m'attends à voir une liste.

S'il vous plaît laissez-moi savoir ce que je fais mal.

Nous vous remercions de votre aide.

+2

Vous ne pouvez pas utiliser 'foreach' pour [afficher une collection] (http://stackoverflow.com/questions/19964553/mvc-form-not-able-to-post-list-of-objects) comme ça. Vous avez besoin d'un index. – Jasen

+0

@Jasen pouvez-vous donner un code pour mon cas comment utiliser l'index? – CB4

+0

Le motif de base est 'pour (int i = 0; i m.Collection [i] .Property)}'. Voici [un autre bon exemple] (http://stackoverflow.com/a/29161796/2030565). – Jasen

Répondre

0

Normalement, vous ne pouvez pas envoyer la liste d'objets au contrôleur dans le classeur de modèle par défaut.

Meilleure solution vous pouvez passer l'objet uniquement basé sur Index pour effectuer l'opération CRUD dans POST, et demande GET vous pouvez obtenir toute la liste d'objets. Donc, dans la méthode POST, cela fonctionne si l'on passe l'objet seulement.

Si vous souhaitez publier la liste d'objets, vous pouvez l'obtenir en remplaçant le ModelBinder ou en utilisant le FormCollection.

Voici un exemple, mais pour effectuer cette opération, nous devons parcourir et convertir dans la liste. Parce que formcollection contient plus de nombre d'éléments et pas dans le type de liste. La clé de la propriété varie, à cause de html helper. Soyez conscient lorsque vous obtenez la valeur de formcollection.

 [HttpPost] 
     public ActionResult Index(FormCollection model) 
     { 
      List<SurveyViewModel> obj = new List<SurveyViewModel>(); 

      var name =Request.Form["item.Name"].Split(',').ToArray(); 
      var pv =Request.Form["item.PV"].Split(',').ToArray(); 

      //length must be same 
      for (var i = 0; i < name.Length; i++) 
      { 
       obj.Add(new SurveyViewModel() 
       { 
        Name = name[i], 
        PV = Convert.ToDouble(pv[i]) 
       }); 
      } 
       return View(); 
     } 
+0

Bien sûr, vous pouvez publier une liste d'objets, et vous n'avez certainement pas besoin d'ajax pour le faire. Suggérez-vous de lire les doublons. –

+0

@StephenMuecke merci –