IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

MVC, champs dynamiques [Débutant]


Sujet :

ASP.NET

  1. #1
    Membre confirmé Avatar de mathisdu42
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2013
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2013
    Messages : 168
    Par défaut MVC, champs dynamiques
    Bonjour,

    sur mon projet ASP.NET MVC j'ai une partie qui récupère des valeurs en base dans des inputs,
    j'aimerais pouvoir offrir la possibilité à l'utilisateur de mettre à jour les informations de ces champs dynamiques.
    Mon contrôleur se charge donc de récupérer les infos en base puis de retourner une vue partielle avec le modèle correspondant,
    jusque là ça va mais dès que je souhaite faire le contraire c'est à dire envoyer le modèle avec les nouvelles valeurs au contrôleur,
    mon modèle est systématiquement null.

    Contrôleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
            [HttpGet]
            public ActionResult GetLigneFraisForfait()
            {
                try
                {
                    string moisActuel = DateTime.Now.Month.ToString("d2") + DateTime.Now.Year;
     
                    HttpResponseMessage GetFraisForfaitsAsync = GlobalVariables.WebApiClient.GetAsync($"api/FraisForfait/{Session["IdVisiteur"]}/{moisActuel}").Result;
     
                    if (GetFraisForfaitsAsync.IsSuccessStatusCode)
                    {
                        var lesFraisForfaits = GetFraisForfaitsAsync.Content.ReadAsAsync<List<FraisForfait>>().Result;
     
                        SaisieViewModel viewModel = new SaisieViewModel
                        {
                            LesFraisForfaits = lesFraisForfaits
                        };
     
                        return PartialView("_SaisieFraisForfait", viewModel);
                    }
     
                    if (GetFraisForfaitsAsync.StatusCode == HttpStatusCode.Unauthorized || GetFraisForfaitsAsync.StatusCode == HttpStatusCode.Forbidden)
                        return Json(new {Message = "Vous ne disposez pas des droits suffisants pour effectuer cette action."});
     
     
                    return PartialView("_SaisieFraisForfait", new SaisieViewModel {LesFraisForfaits = new List<FraisForfait>()});
                }
                catch (Exception)
                {
                    return Json(new {Message = "Une exception non gérée est survenue lors de la mise à jour de vos informations."});
                }
            }
    Vue partielle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    @model GSB_MVC.ViewModels.SaisieViewModel
     
    @{
        Layout = null;
    }
     
    @if (Model.LesFraisForfaits != null)
    {
        using (Html.BeginForm("UpdateFraisForfait", "Saisie", FormMethod.Post))
        {
            <div>
                @{
                    decimal Total = 0;
                    int row = 0;
                }
                @foreach (var item in Model.LesFraisForfaits)
                {
                    Total += item.Total;
                    if (row == 0)
                    {
                        @:<div class="row">
                        }
                        <div class="col">
                            <label for="@item.IdFraisForfait" class="control-label">@item.LibelleFraisForfait</label>
                            <input type="text" class="form-control mb-3" name="@item.IdFraisForfait" placeholder="Nom" value="@item.Quantite" />
                        </div>
                        if (row == 1)
                        {
                            row = 0;
                        @:</div>
                    }
                    else
                    {
                        row++;
                    }
                }
                <label for="txtTotal" class="control-label">Total (tarifs appliqués)</label>
                <input type="text" class="form-control" id="txtTotal" placeholder="Montant total" readonly value="@Total €" />
                <br />
                <div>
                    <button id="btnMajFicheFrais" type="submit" class="btn btn-primary">Mettre à jour</button>
                </div>
            </div>
        }
        <script>
            $("#loadSpinnerSaisie").html("");
            $("#btnMajFicheFrais").show();
        </script>
    }
    Contrôleur (après la tentative de post) :

    Nom : sc.png
Affichages : 111
Taille : 8,0 Ko

    J'imagine que le problème vient de la vue partielle mais j'ai essayé plusieurs choses en vain..
    Si éventuellement vous avez quelques pistes je suis preneur.

    Merci.

  2. #2
    Membre confirmé Avatar de mathisdu42
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2013
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2013
    Messages : 168
    Par défaut
    J'ai finalement pu résoudre mon problème. Je partage ici pour ceux qui auraient besoin d'aide.

    Mon problème venait bel et bien de ma vue partielle et plus précisément de mon parcours
    de collection. En effet, initialement j'utilisais de simples inputs et faisais le binding direct depuis "item" de la boucle.
    Finalement j'ai procédé comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
                @{
                    int index = -1;
                }
                @foreach (var item in Model.LesFraisForfaits)
                {
                    index++;
     
                    <div class="col">
                        <label for="@item.IdFraisForfait" class="control-label">@item.LibelleFraisForfait</label>
                        @Html.TextBoxFor(i => @Model.LesFraisForfaits[index].Quantite, new { @class = "form-control mb-3" })
                        @Html.HiddenFor(i => @Model.LesFraisForfaits[index].IdFraisForfait)
                    </div>
     
                }
    J'ai donc remplacé mon input par un TextBoxFor puis fait le binding des propriétés en passant par le modèle, pour différencier chaque
    champs il est nécessaire d'ajouter un index, incrémenté à chaque passage dans la boucle. J'ajoute un élément invisible en guise d'ID pour mes objets.
    Enfin, j'ai remplacé le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using (Html.BeginForm("UpdateFraisForfait", "Saisie", FormMethod.Post))
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    using (Ajax.BeginForm("UpdateFraisForfait", "Saisie", null,
                              new AjaxOptions() { OnBegin = "", OnSuccess = "", OnFailure = "", OnComplete = "" }, null))
    pour gérer les différents événements.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. accés aux champs dynamiques ?
    Par bassim dans le forum Bases de données
    Réponses: 3
    Dernier message: 07/11/2005, 20h58
  2. [Spring MVC] Formulaire dynamique
    Par partyboy dans le forum Spring Web
    Réponses: 7
    Dernier message: 17/10/2005, 10h52
  3. [CR] Taille champ dynamique
    Par reflex dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 06/08/2004, 08h43
  4. [struts] probleme champs dynamiques
    Par rocco dans le forum Struts 1
    Réponses: 28
    Dernier message: 07/06/2004, 21h26
  5. ajouter un champ dynamiquement à une instance de table
    Par maniack dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/02/2004, 23h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo