2010-04-26 10 views
0

J'expérimente actuellement le type de projet Web Application Data Entity dynamique dans VS2008 SP1 et après avoir lu de nombreux didacticiels qui offrent des conseils utiles sur les problèmes auxquels je n'ai pas besoin de solution Je suis tombé au premier obstacle.Arrêt de l'affichage du filtre dans l'application Web de l'entité de données dynamiques

Dans le DB j'ai fait mon modèle d'entité de J'ai décidé de commencer petit avec une table appelée "Entreprises" juste pour voir si je pourrais ajuster l'affichage dans une forme satisfaisante pour cette petite table. La table Companies a une colonne appelée "contactid" qui conduit à un enregistrement rempli de diverses informations de contact dans une table "contacts".

Le modèle de données d'entités créé par défaut a supposé qu'une entreprise pouvait avoir plusieurs enregistrements de contacts. Donc, il essaie d'être utile et ajouter un filtre "Contact" sur la page qui vous permet de voir toutes les sociétés qui partagent un ensemble particulier d'informations de contact indexées par le champ "Contact Name".

Malheureusement, la table de contact est une table polyvalente qui stocke également les informations de contact pour les clients et il y a environ 1000 fois plus de clients que d'entreprises. Ainsi, la liste déroulante augmente le temps de chargement de la page de manière exponentielle et ne produit aucun avantage. Donc, je voudrais simplement empêcher l'apparition du filtre. Le seul problème est que je n'ai pas la moindre idée de comment l'éteindre. Google se montre jusqu'ici récalcitrant sur le sujet et je me demandais si quelqu'un ici savait comment se débarrasser d'un filtre inutile.

Répondre

1

J'ai récemment eu le même problème. Je suis nouveau dans le modèle Dynamic Data Application et j'ai été rapidement impressionné par ses fonctionnalités prêtes à l'emploi. Cependant, j'ai noté quelques inconvénients, en particulier celui que vous avez mentionné. Plusieurs de mes pages ont pris une éternité à se charger, et quand j'ai découvert qu'il était causé par la liste déroulante de la clé étrangère, il m'a fallu un certain temps pour trouver une solution. Le problème est que ce comportement est essentiel au fonctionnement interne du site Web. Ces listes déroulantes de clés étrangères pilotent réellement le jeu de résultats dans la grille de données. (La ddlist est remplie, puis la valeur par défaut est définie, ce qui déclenche un événement pour filtrer la grille de données.) La clé est donc de modifier ce comportement au lieu de le désactiver. Mon premier indice pour résoudre ce problème est venu d'une excellente série de blogs que j'ai trouvé sur le web. Kudos to Stephen Naughton Le concept consiste à créer un attribut de métacolonne et à décorer les entités problématiques dans vos classes partielles pouvant être évaluées. (Je l'ai appelé DisableFilter mien)

Ainsi, vous vous retrouverez avec une table et une définition de classe partielle métatable semblable à:

[MetadataType(typeof(InvoiceMetadata))] 
public partial class Invoice { 

} 

public partial class InvoiceMetadata { 
    [ScaffoldColumn(false)] 
    public string InvoiceId { get; set; } 
    [ScaffoldColumn(false)] 
    public string LiquidatorInvoiceId { get; set; } 
    [ScaffoldColumn(false)] 
    public string CreatedBy { get; set; } 
    [ScaffoldColumn(false)] 
    public System.Nullable<System.DateTime> LastModifiedDate { get; set; } 
    [ScaffoldColumn(false)] 
    public string LastModifiedBy { get; set; } 
    [DisableFilter] 
    public LeadAccount LeadAccount { get; set; } 
} 

Mon attribut nouvellement créé, DisableFilter, décore la LeadAccount (Notre table Contact) collection.

Une fois la colonne décorée, j'ai ensuite modifié le comportement de base du contrôle ForeignKey.ascx en ajoutant une vérification du nouvel attribut. Si le filtre est désactivé, je ne remplis que la liste avec l'élément par défaut.

if (!Page.IsPostBack) { 
      if (!Column.IsRequired) { 
       DropDownList1.Items.Add(new ListItem("[Not Set]", NullValueString)); 
      } 
      if (Column.IsFilterDisabled()) { 

       DropDownList1.Items.Add(new ListItem(DefaultValue, DefaultValue)); 
      } 
      else { 
       PopulateListControl(DropDownList1); 
      } 
      // Set the initial value if there is one 
      string initialValue = DefaultValue; 
      if (!String.IsNullOrEmpty(initialValue)) { 
       DropDownList1.SelectedValue = initialValue; 
      } 
     } 
    } 

Son pas tout à fait ce que j'appelle une solution complète, principalement la valeur du filtre ne contiendra pas un nom d'utilisateur convivial. Je n'ai pas pris la peine de le résoudre pour le moment, mais cela devrait vous aider à résoudre votre problème.