La meilleure façon d'enregistrer des données sur une vue fortement typée lorsque tous les champs sont chargés

StackOverflow https://stackoverflow.com/questions/1876781

Question

Disons que j'ai une vue d'édition qui est fortement typé à une table appelée « MyData ». La vue comporte plusieurs languettes, chacune avec plusieurs champs différents de la table. Pour les performances, les données sont chargé uniquement lorsque l'onglet est affiché, donc si vous ne modifiez un champ sur l'onglet 1 et soumettez le formulaire, les données de l'onglet 2 ne seront pas chargés.

Le problème que je suis en cours d'exécution en est le soumettre. Je fais la routine typique de trouver l'enregistrement existant dans la base de données et mise à jour des valeurs transmises:

<AcceptVerbs(HttpVerbs.Post)> _
Function Edit(ByVal data As MyData) As ActionResult

    Using dc = New MyDataContext
        Dim orig = dc.MyDatas.Single(Function(x) x.id = data.id)
        orig.name = data.name
        orig.desc = data.desc
        ...
        SubmitChanges()
    End Using

    Return View(orig)

End Function

Cependant, cette méthode ne sait pas quels onglets ont été chargés, donc si l'onglet avec « desc » à ce sujet n'est pas chargé, cette méthode pense l'utilisateur occulté le champ « desc », et envoie NULL à la base de données.

Comment puis-je construire ceci de sorte que sont envoyés à la base de données, et les champs sont ignorés champs déchargés uniquement chargés?

Était-ce utile?

La solution

Y at-il une raison quelconque vous ne l'utilisez UpdateModel(orig)?

Si vous utilisez le modèle de liaison, plutôt que d'aller manuellement à travers le contenu du formulaire et en attribuant les valeurs, ce serait pris en charge pour vous. Le comportement du modèle par défaut de liaison est d'ignorer les propriétés qui ne contient pas les valeurs de formulaire correspondant.

Vous pouvez jeter un oeil à ce href="https://stackoverflow.com/questions/1242758/what-is-correct-behaviour-of-updatemodel-in-asp-net-mvc"> , et l'article lié là-bas, pour en savoir plus sur le modèle de liaison.

Autres conseils

Je recommande d'avoir une méthode d'action pour chaque onglet qui vient de mettre à jour les champs de cet onglet. La forme de chaque onglet serait alors simplement soumettre à l'action appropriée.

Peut-être un modèle ViewModel peut vous aider ici, où vous partie votre modèle d'origine comme les onglets vues quelque chose comme:

public class Tab1 
    {
        public string pproperty1 { get; set; }
        public string pproperty2 { get; set; }
    }
    public class Tab2
    {
        public string pproperty3 { get; set; }
        public string pproperty4 { get; set; }
    }
    public class Tab3
    {
        public string pproperty5 { get; set; }
        public string pproperty6 { get; set; }
    }
    public class ViewModels
    {
        public Tab1 TAB1 { get; set; }
        public Tab2 TAB2 { get; set; }
        public Tab3 TAB3 { get; set; }
    }

Lorsque vous liez les valeurs Posté si le Tab2 == null alors vous savez que ces propriétés ne sont pas par l'utilisateur chargés ni modifiés.

PD: Désolé pour le c #, il avait été un temps vu que je Vb Codé

.
scroll top