2009-12-09 17 views
0

Disons que j'ai une vue d'édition qui est fortement typée à une table appelée "MyData". La vue comporte plusieurs onglets, chacun avec plusieurs champs différents de la table. Pour les performances, les données ne sont chargées que lorsque l'onglet est affiché. Par conséquent, si vous modifiez uniquement un champ de l'onglet 1 et soumettez le formulaire, les données de l'onglet 2 ne seront pas chargées.Meilleure façon d'enregistrer des données sur une vue fortement typée lorsque tous les champs ne sont pas chargés

Le problème que je rencontre est sur 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 » sur il n'est pas chargé, cette méthode pense que l'utilisateur a supprimé le champ "desc" et envoie NULL à la base de données.

Comment puis-je construire ceci afin que seuls les champs chargés soient envoyés à la base de données et que les champs non chargés soient ignorés?

Répondre

1

Y a-t-il une raison pour laquelle vous n'utilisez pas UpdateModel(orig)?

Si vous utilisiez la liaison de modèle, plutôt que de passer manuellement le contenu du formulaire et d'affecter les valeurs, cela serait pris en compte pour vous. Le comportement de liaison de modèle par défaut consiste à ignorer les propriétés qui n'ont pas de valeurs de formulaire correspondantes.

Vous voudrez peut-être jeter un oeil à this post, et l'article lié là-bas, pour en savoir plus sur la liaison du modèle.

+0

Je suppose que vous ne voulez pas dire "UpdateModel (orig)", car cela ne fait référence à aucune des données de formulaire, mais comment puis-je configurer cela à partir de mon exemple original? Serait-ce "UpdateModel (data)"? Lorsque j'essaie cela, je reçois un peu inutile "Le modèle de type" MyProject.MyData "n'a pas été mis à jour avec succès." – gfrizzle

0

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; } 
    } 

Alors lorsque vous liez les valeurs Posté si le Tab2 == null alors vous savez que ces propriétés étaient non chargé ni modifié par l'utilisateur.

PD: Désolé pour le C#, c'était un temps vu que je vb codé.

0

Je recommande d'avoir une méthode d'action distincte pour chaque onglet qui met à jour les champs de cet onglet. Le formulaire sur chaque onglet serait alors simplement soumis à l'action appropriée.