2010-10-22 30 views
1

Je tente de créer un UserControl dans ASP.NET pour afficher les éléments d'actualité en fonction de deux valeurs transmises, NewsTag et ItemLimit. Le problème est que SQLdatasource ne récupère pas les propriétés dans SqlDataSource1_Init. Au lieu de cela, les appels aux propriétés sont vides lors de l'appel, mais après le rendu ont des valeurs.Problèmes lors de la transmission de propriétés dans UserControl Asp.Net

<script runat="server"> 
    Public Property NewsTag() As String 
     Get 
      Dim o As Object = ViewState("NewsTag") 
      If Not o Is Nothing Then Return CStr(o) Else Return Nothing 
     End Get 
     Set(ByVal value As String) 
      ViewState("NewsTag") = value.Replace(" ", "") 
     End Set 
    End Property 

    Public Property ItemLimit() As String 
     Get 
      Dim o As Object = ViewState("ItemLimit") 
      If Not o Is Nothing Then Return CStr(0) Else Return Nothing 
     End Get 
     Set(ByVal value As String) 
      'Limit news items to 50, for readability 
      ViewState("ItemLimit") = Math.Max(Math.Min(CInt(value), 50), 5) 
     End Set 
    End Property 

    Protected Sub SqlDataSource1_Init(ByVal sender As Object, ByVal e As System.EventArgs) 
     SqlDataSource1.SelectCommand = "SELECT top " + ItemLimit() + " a.[id], a.[itemdate], a.[title], a.[description], a.[photo] FROM [Announcements] a, [NewsInTags] n, [Tags] t WHERE ('" + NewsTag() + "' = t.Tag AND t.id = n.TagId AND a.id = n.NewsId) OR (n.TagId = 1 AND a.id = n.NewsId) order by itemdate desc " 
     SqlDataSource1.DataBind() 
    End Sub 
</script> 

<div class="halflist"> 
<asp:Repeater ID="Repeater2" runat="server" DataSourceID="SqlDataSource1"> 
    <ItemTemplate> 
     <div class="listitem"> 
      <h3> 
       <a href='<%# "/News/Article/" &Cstr(Eval("ID"))& "/" & helpers.urlSafe(Cstr(Eval("title")))%>'> 
        <asp:Label ID="Label4" runat="server" Text='<%# Eval("title") %>' /> 
       </a> 
      </h3> 
      <div class="thumbnail"> 
       <a href='<%# "/News/Article/" &Cstr(Eval("ID"))& "/" & helpers.urlSafe(Cstr(Eval("title")))%>'> 
        <Club:IThumb ID="ImageThumbnail2" runat="server" PhotoID='<%# Eval("photo") %>' /> 
       </a> 
      </div> 
      <asp:Label ID="Label3" class="liststamp" Font-Size="Smaller" runat="server" Text='<%# Eval("itemdate","{0:d}") %>' /> 
      <p> 
       <asp:Label ID="Label2" runat="server" Text='<%# helpers.CutIt(Convert.ToString(Eval("description")),150)%>' /> 
       <a class="readMore" href='<%# "/News/Article/" &Cstr(Eval("ID"))& "/" & helpers.urlSafe(Cstr(Eval("title")))%>'>read more &raquo;</a> 
      </p> 
      <div class="clearlist"> 
      </div> 
     </div> 
    </ItemTemplate> 
</asp:Repeater> 
</div> 
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ProviderName="System.Data.SqlClient" 
    ConnectionString="<%$ ConnectionStrings:ClubSiteDB %>" 

    SelectCommand="SELECT top @items a.[id], a.[itemdate], a.[title], a.[description], a.[photo] FROM [Announcements] a, [NewsInTags] n, [Tags] t WHERE (@tag = t.Tag AND t.id = n.TagId AND a.id = n.NewsId) OR (n.TagId = 1 AND a.id = n.NewsId) order by itemdate desc " 
    oninit="SqlDataSource1_Init"> 
       <SelectParameters> 
       <asp:Parameter Name="items" Type="Int16" DefaultValue="5" /> 
       <asp:Parameter Name="tag" Type="String" /> 
       </SelectParameters> 
       </asp:SqlDataSource> 

Toute aide serait génial, merci

Répondre

0

problème ici est que vous essayez d'accéder à l'état d'affichage (via les propriétés) en cas init (de source de données) où il n'est pas disponible si vos propriétés renverront une chaîne nulle.

Vous pouvez modifier votre commande select dans l'événement load au lieu de init. Notez que vous pouvez également utiliser Page_Load pour modifier les propriétés de la source de données. Une autre solution consisterait à gérer l'événement SqlDataSource.Selecting et à modifier l'objet Command à partir des arguments d'événement en fonction de vos besoins (utilisez SqlDataSourceCommandEventArgs.Command pour accéder à la commande lors de la sélection du gestionnaire d'événements).

+0

J'ai essayé vos deux suggestions et la commande SQL est en cours de modification avant que le contrôle tente de lier, mais les valeurs qui sont passées à partir du paramètre sont null. Cela provoque une erreur de syntaxe incorrecte. –

+0

@Mikey, si les propriétés retournent NULL signifie pas d'état d'affichage. Comme votre logique dans le contrôle de l'utilisateur, il peut être lié à cela. Est-ce que vous chargez le contrôle utilisateur dynamiquement? Pouvez-vous partager le code qui utilise le contrôle utilisateur sur la page? Peu importe, vous devez vérifier deux choses pour que l'état d'affichage fonctionne: assurez-vous que le même ID est assigné au contrôle utilisateur et que le contrôle utilisateur est chargé le plus tôt possible (le temps de conception est le meilleur . – VinayC