DataBinding在我的ASP.NET UserControl中不起作用

时间:2010-07-30 16:09:47

标签: asp.net data-binding custom-controls repeater

<asp:Repeater ID="repFilter" runat="server">
                        <HeaderTemplate>
                            <div id="posting" align="center">
                        </HeaderTemplate>

                        <ItemTemplate>
                            <div class="friends_area" id="record-">
                                <%# ((Alert)Container.DataItem).Message %>
                                <asp:Literal Visible="false" ID="litAlertId" Text='<%# ((Alert)Container.DataItem).AlertId %>' runat="server"></asp:Literal>
                                <Company:Comments ID="Comments1" SystemObjectRecordId='<%# ((Alert)Container.DataItem).AlertId %>' runat="server" SystemObjectId="7"></Company:Comments>
                            </div>
                        </ItemTemplate>

                        <FooterTemplate>
                            </div>
                        </FooterTemplate>
                    </asp:Repeater>

我在转发器中设置自定义控件的SystemObjectRecordID属性时遇到问题。目前,该值在数据库中变为零。我检查/值得指出的事情:

1)AlertId是数据库中的主键标识列,该表有许多行,因此AlertId应返回多个值。

2)DB列(bigint)的数据类型和AlertId(long)的数据类型以及getter / setter SystemObjectRecordID变量(long)的数据类型匹配。

3)如果我设置'&lt;%#((Alert)Container.DataItem).AlertId%&gt;'到文字的Text属性我得到了预期的结果。因此,它与我的自定义控件有关,特别是数据绑定到SystemObjectRecordID属性的方式。

4)如果我将SystemObjectRecordID从long更改为string然后执行((Alert)Container.DataItem).AlertId.ToString()我在调试中为SystemObjectRecordId获取的值为null(但在分配给文本时仍然有效)文字的属性。)

5)用户控件的位置是default.aspx,控件是comments.ascx。代码文件不共享命名空间。

6)我试过操作我的转发器的OnItemDataBound属性但是因为我已经用文字证明数据 使用声明值绑定我不知道我还能在其中做什么OnItemDataBound的方法逻辑。

一旦最终用户在UI中发表评论,SystemObjectRecordId值(在页面加载时应该已经分配 - 我们知道在文字的情况下它已经分配)应该传递给代码隐藏custom usercontrol:

namespace Company.ProjectWeb.UserControls
{
    public partial class Comments : UserControl, IComments
    {
        private readonly IUserSession _userSession;
        private CommentsPresenter _presenter;
        public int SystemObjectId { get; set; }
        public long SystemObjectRecordId { get; set; }

无论我做什么,当我通过default.aspx页面上的自定义用户控件传递时,SystemObjectRecordId总是为零。我没有想法 - 此时可以使用一些建议。谢谢。

2 个答案:

答案 0 :(得分:0)

好的,我已经通过向ViewState添加SystemObjectRecordId找到了解决方法:

public long SystemObjectRecordId
        {
            get
            {
                if (ViewState["SystemObjectRecordId"] != null)
                    return long.Parse(ViewState["SystemObjectRecordId"].ToString());
                else
                    return 0;
            }
            set
            {
                ViewState["SystemObjectRecordId"] = value;
            }
        }

它不是主意,但它有效。我仍然不明白为什么我不能像以前指定的那样设置声明性值,但现在必须这样做。

答案 1 :(得分:0)

您应该可以通过将Bindable属性添加到SystemObjectRecordId属性来解决此问题。