Question

J'ai une application de panier courir sur monorail et en utilisant le château ActiveRecord / NHibernate, et il y a une table ShoppingCart et une table ShoppingCartItems, qui sont mis en correspondance avec les entités.

Voici le scénario: un utilisateur ajoute des choses au panier, disons 5 articles, et va voir le panier. Le panier montre l'ensemble des 5 articles. l'utilisateur copie l'onglet / fenêtre et obtient un autre onglet du même panier (appeler onglet B). l'utilisateur supprime un élément du panier, maintenant il y a 4 éléments dans l'onglet B, mais dans l'onglet d'origine A, il y a encore 5 articles. l'utilisateur retourne à l'onglet A, et les mises à jour quelque chose dans le panier et clique sur le bouton « mise à jour », qui présente les modifications. mon action monorail essaie de faire une ARDataBind sur ShoppingCartItems en utilisant les données de la vue, qui comprend l'ensemble des 5 articles. quand il arrive à l'élément que l'utilisateur supprimé de l'onglet B, il lance une « Aucune ligne avec l'identifiant donné existe » pour cet article.

Je ne peux pas savoir s'il y a un moyen de l'avoir lie pas cette ligne, return null, retour nouvelle instance, etc.? il y a un paramètre AutoLoadBehavior sur l'attribut ARDataBind, mais qui semble affecter uniquement le chargement des entités enfants, et non l'entité racine. quel que soit l'option que je choisis, je reçois l'exception avant que le contrôle entre même la méthode d'action (sauf AutoLoadBehavior.Never, mais cela ne me aide pas vraiment).

au lieu, j'ai le code qui appelle Request.ObtainParamsNode () pour tirer les noeuds de formulaire et les analyser manuellement des objets, et ignore ceux qui n'existent plus. est-il une meilleure façon?

merci.

Était-ce utile?

La solution

ARDataBinder , override FindByPrimaryKey(Type targetType, object id):

protected override object FindByPrimaryKey(Type targetType, object id) {
  return FindByPrimaryKey(targetType, id, false);
}

La clé est ici false paramètre, ce qui en fait retourner null au lieu de jeter.

Alors hériter ARDataBindAttribute , remplacer la méthode CreateBinder () et le faire revenir votre nouveau classeur au lieu du ARDataBinder par défaut.

Ensuite, appliquez votre attribut classeur personnalisé au lieu de ARDataBindAttribute.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top