2017-09-08 3 views
1

J'ai ce code en C# en utilisant EF Core 1.2 où j'ai un formulaire contenant deux boutons d'envoi. Le premier bouton 'upload' appelle ma méthode 'UpLoadMyFile' qui compare chaque ligne de ma zone de texte à un motif et retourne une chaîne qui me dit si elle correspond à un motif. Puis-je ajouter tout mon texte et ses états dans unComment passer la liste <Tuple> de la table au contrôleur?

List <Tuple<string, string>> 

que je passe à mon point de vue via un ViewModel et afficher chaque ligne ainsi que son état dans une table.

Maintenant j'essaye de sauvegarder chaque ligne dans ma base de données quand je clique sur mon deuxième bouton 'enregistrer'. Mais chaque fois que j'essaie de sauvegarder mes lignes, une exception NullReferenceException se produit: qui me dit que ma liste de ma table est nulle.

Je voudrais savoir comment passer toutes les lignes et les états de ma table 'MyTupleList' à ma méthode de post parce que je ne sais vraiment pas comment résoudre mon problème.

Mon Vue:

@model Models.ViewModels.CreateSaetzeModelView 
<form asp-action="ProcessCreateLines" asp-controller="SoftwareService" method="post" enctype="multipart/form-data"> 

<div class="div-marginBottom">   
    <table class="table">   
     <tbody> 
      <tr> 
       <td> 
        <textarea name="ExpressionTextarea" id="ExpressionTextarea" runat="server" TextMode="MultiLine" asp-for="@Model.LoadExpressions"></textarea> 

        <div class="col-md-10"> 
         <input type="submit" name="upload" value="upload" /> !--Calls 'uploadmyfile' action--> 
        </div> 
       </td> 
       <td></td> 
      </tr> 
     </tbody> 
    </table> 
</div> 
<br /> 
<div class="div-ExpressionEingabe"> 

</div> 
@if (Model.MyLinesList != null) 
{ 
    <div class="div-marginBottom"> 
     <table id="MyTupleList" class="table table_align"> 
      <thead> 
       <tr> 
        <th> 
         State 
        </th> 
        <th> 
         MyLines 
        </th> 
       </tr> 
      </thead> 
      <tbody> 

        @foreach (var item in Model.MyLinesList) 
       { 
        <tr> 
         <td>        
          @Html.DisplayFor(modelItem => item.Item2) 
         </td> 
         <td> 
          @Html.DisplayFor(modelItem => item.Item1)        
        </tr> 
       } 

      </tbody> 
     </table> 
     <input type="submit" name="save" value="save" /> 
    </div> 
} 

Mon code:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> ProcessCreateLines(string upload, string save, CreateLinesModelView cmv) 
    {   
     //Button 'upload': Checking my lines 
     if (!string.IsNullOrEmpty(upload)) 
     { 
      string expressions = Request.Form["ExpressionTextarea"].ToString(); 

      List<Tuple<string, string>> result = new FileUploadController().CheckExpressions(expressions); 

      cmv.MyLinesList = result; 

      return View("ProcessCreateLines", cmv); 

     } 

     //Button 'save': Saving my lines into a Database 
     if (!string.IsNullOrEmpty(save)) 
     { 
    // ****************************MyLinesList is null******************* 
      var list = cmv.MyLinesList; 

      ...saving my list into database... 
      } 

     } 
+0

Votre vue ne stocke pas le contenu de 'MyLinesList' (il est seulement l'affichage avec des étiquettes, pas comme des données de formulaire). Lorsque vous cliquez ensuite sur le bouton Enregistrer, le formulaire n'a pas de données 'MyLinesList' à envoyer au contrôleur, ce qui signifie que la propriété' MyLinesList' sera 'null' lorsque le modèle sera rempli. Votre méthode 'ProcessCreateLines' est également en train de violer SRP, car vous forcez deux éléments de logique complètement distincts à travailler dans la même méthode (sans justification perceptible) – Flater

+0

@Flater Comment stocker le contenu dans ma vue? J'ai essayé par exemple en remplaçant @ Html.DisplayFor (modelItem => item.Item2 avec

+0

Je ne suis pas sûr de stocker une 'Liste ', je suppose qu'un simple 'HiddenFor' est incapable de le faire automatiquement (mais par tous les moyens, essayez-le.Si cela fonctionne, vous avez votre réponse.) Si je trouve un moyen , Je posterai une réponse – Flater

Répondre

0

j'ai réussi à résoudre mon problème grâce au commentaire de @StephenMuecke en utilisant au lieu d'une Tupel une classe selfmade

public class MyListModel 
{ 
    public string myLine { get; set; } 
    public string myState { get; set; } 
} 
} 

et la création d'une liste hors dans mon ViewModel

public List<MyListModel> LineWithState { get; set; } 

également à mon avis j'ai remplacé la boucle foreach avec une boucle

@for (int i = 0; i < Model.LineWithState.Count; i++) 
       { 
        <tr> 
         <td> 
          @Html.TextBoxFor(m=>m.LineWithState[i].myState) 
         </td> 
         <td> 
          @Html.TextBoxFor(m=>m.LineWithState[i].myLine) 
        </tr> 

       }