Проблемы с передачей свойств в UserControl Asp.Net - PullRequest
1 голос
/ 22 октября 2010

Я пытаюсь создать UserControl в ASP.NET для отображения новостных элементов на основе двух передаваемых значений: NewsTag и ItemLimit. Проблема в том, что источник данных SQL не выбирает свойства в SqlDataSource1_Init. Вместо этого вызовы свойств являются пустыми, когда это вызывается, но после рендеринга имеют значения.

<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>

Любая помощь была бы отличной, спасибо

1 Ответ

0 голосов
/ 22 октября 2010

Проблема здесь в том, что вы пытаетесь получить доступ к состоянию просмотра (через свойства) в событии init (источника данных), когда оно недоступно, поэтому ваши свойства вернут пустую строку.

Вы можете изменить свою команду выбора в событии загрузки вместо init. Обратите внимание, что вы также можете использовать Page_Load для изменения свойств источника данных.

Еще один способ - обработать событие SqlDataSource.Selecting и изменить объект Command из аргументов события в соответствии с вашими потребностями (используйте SqlDataSourceCommandEventArgs.Command для доступа к команде при выборе события. обработчик).

...