2010-10-05 3 views
0

Mon problème consiste à mettre à jour une entité via un formulaire d'édition avec une référence à une autre entité représentée par une liste déroulante. J'utilise ASP.NET MVC 2. Détails:Entité modifier le formulaire avec référence à une autre entité par liste déroulante

Public Class Category 
{ 
    int Id { get; set;} 
    string Name { get; set} 
    Category Parent { get; set} 
} 
  • Une page d'édition de la catégorie générée par EditorFor
  • Modifier la page contient un menu déroulant pour sélectionner la catégorie parente, avec le nom/id = Parent.Id
  • Il y a une entrée 'none' dans la liste déroulante avec value='' (pour les catégories sans parent).

processus de mise à jour en action:

  • entité actuelle extraite du référentiel par id.
  • TryUpdateModel appliquée à l'entité récupérée

Problème:

Lorsqu'une catégorie éditée est soumise, si le menu déroulant est réglé sur « none » une nouvelle entité est instancié pour « parent » quand il essaie de mettre à jour sur le parent.id. Cela provoque des problèmes lors de la persistance via l'ORM. Alors, que faire dans cette situation? Est-il possible d'empêcher l'instanciation de l'objet 'parent' et de laisser la référence parente nulle?

Merci. J'utilise NHibernate comme ORM, au cas où cela serait utile.

Répondre

0

Vous pouvez ajouter parentId paramètre à la méthode d'action et vérifier manuellement si elle est nulle puis appelez TryUpdateModel méthode avec excludeProperties mis à

new [] {"Parent"} 
+0

J'espérais vraiment une solution plus générale. Cela doit être un scénario souvent confronté à un problème? Cependant, je devrais peut-être aller avec quelque chose comme ça. Merci. – UpTheCreek

2

On dirait un bon scénario pour un liant de modèle personnalisé:

public class CategoryModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var model = base.BindModel(controllerContext, bindingContext) as Category; 
     if (model != null && model.Id == null) // adapt this test if necessary 
     { 
      return null; 
     } 
     return model; 
    } 
} 

Et Application_Start:

ModelBinders.Binders.Add(typeof(Category), new CategoryModelBinder()); 

Assurez-vous également que la propriété Id sur votre modèle est un entier nullable ou que le classeur se bloquera si vous tentez de le lier à une chaîne vide.

+0

Ah, ça ressemble au billet - merci darin. – UpTheCreek

+0

Existe-t-il un moyen de le faire sans rendre l'identifiant null? Je préfère rester avec un type d'identifiant 'normal' si possible. Je ne veux pas jouer avec la façon dont Nhibernate est censé assigner des identifiants à un nouvel objet qui devrait être stocké non plus. – UpTheCreek

+0

Vous devez utiliser des modèles de vue lorsque vous travaillez avec les vues et ne travaillez pas directement avec les entités NHibernate. –

Questions connexes