2009-12-18 6 views
2

Je dois créer une clause WHERE pour mon LinqDataSource qui dépend de l'utilisateur actuellement connecté. Bien sûr, j'ai accès à l'utilisateur actuellement connecté dans le code-behind et j'ai spécifiquement besoin de l'ID utilisateur pour récupérer uniquement les données qui lui appartiennent dans la base de données.ASP.NET LinqDataSource Clause WHERE

Il fonctionne très bien quand j'ajoute l'attribut Where à la balise <asp:LinqDataSource /> mais étant donné que les contrôles serveur ne peuvent pas avoir <% %> balises en eux, j'ai essayé de définir l'attribut Where dans le code-behind, en OnLoad, avant que les données de liaison GridView qui est connecté à ma source de données. Cependant, lors de la définition de l'attribut dans le code-behind, il semble n'avoir aucun effet. Cela fonctionne bien quand je le spécifie manuellement (et statiquement) dans le code ascx, mais pas à partir du code-behind. Je suppose que je fais les choses dans le mauvais ordre ou au mauvais moment. Comment puis-je faire cela?

MISE À JOUR:

est venu avec ce hack. J'utilise une étiquette factice lblViewedUserID avec Visible="false" pour obtenir un contrôle à partir duquel je peux extraire l'ID utilisateur. J'ai mis le texte de cette étiquette du code-behind avant la liaison de données. J'ai également ajouté <WhereParameters> avec <asp:ControlParameter /> avec un tas d'attributs.

<asp:LinqDataSource ID="dsLinqSource" AutoPage="true" AutoSort="true" 
    ContextTypeName="Ortrac.Common.Dbml.OrComDataContext" 
    EnableDelete="false" TableName="myTableName" EnableInsert="false" 
    EnableUpdate="false" runat="server" Select="new(Edited, Activity)" 
    Where="TheUserID.ToString().Equals(@ViewedUserID)"><%-- HACK! --%> 
    <WhereParameters> 
    <asp:ControlParameter Name="ViewedUserID" ControlID="lblViewedUserID" 
          Type="String" PropertyName="Text" /> 
    </WhereParameters> 
</asp:LinqDataSource> 

<%-- Dummy label --%> 
<asp:Label runat="server" ID="lblViewedUserID" Visible="false" /> 

Est-ce vraiment ainsi que vous programmez ASP.NET?

+0

Votre approche m'a sauvé beaucoup de temps, je vous remercie! –

Répondre

1

Le code que vous avez affiché est en fait une approche parfaitement acceptable. Si vous avez besoin de le faire souvent, vous pouvez hériter de la classe Parameter pour créer vos propres paramètres personnalisés. Voici ce que nous utilisons:

public class CurrentUserIdParameter : System.Web.UI.WebControls.Parameter 
{ 

    protected override int Evaluate(System.Web.HttpContext context, System.Web.UI.Control control) 
    { 
     if (Contact.Current == null) { 
      return -1; 
     } 
     else { 
      return Contact.Current.ContactID; 
     } 
    } 
} 

Cela fonctionne bien dans un certain nombre de situations - nous avons aussi une CurrentLanguageIdParameter, CurrentInstanceIdParameter, etc.