<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总是为零。我没有想法 - 此时可以使用一些建议。谢谢。
答案 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属性来解决此问题。