我的.NET Web应用程序中有一些用户控件,我在同一页面中使用它们。它们有一些属性,出于某种原因,我需要一些隐藏字段来保存属性的值。
因此,在其中一个用户控件中有这段代码:
<input type="hidden" data-versus="PL" value="<%= vs_pl %>" />
其中vs_pl是控件的属性:
private decimal? _vs_pl; // plan
public decimal? vs_pl {
get { return _vs_pl; }
set { _vs_pl = value; }
}
所有这些都正确地呈现为:
<input type="hidden" data-versus="PL" value="-190.2">
在另一个用户控件中,我有一段类似的代码:
<asp:HiddenField ID="hfOrg" runat="server" Value='<%= org %>' />
凡组织是与上述类似的财产。但这表现为:
<input type="hidden" name="ctl00$cs$hfOrg" id="cs_hfOrg" value="<%= org %>">
在同一页面中。这两个控件都没有内部数据绑定或数据控件,也没有绑定到页面中的数据源。
我意识到第一种情况不是服务器控件,只是普通的HTML输入标签,而后者则由服务器呈现。但是我发现这是一种奇怪的行为,我也希望它能在第二种情况下发挥作用。
我哪里错了?
答案 0 :(得分:3)
<%= %>
是Response.Write的快捷方式,它只能在纯HTML中使用
<input type="hidden" data-versus="PL" value="<%= vs_pl %>" />
您应该在像这样的服务器控件中使用DataBinding
<input type="hidden" name="ctl00$cs$hfOrg" id="cs_hfOrg" value="<%# org %>">
重要的是要记住,如果您使用DataBindings,您应该直接或间接调用UserControl的DataBind
方法,但调用父控件或页面的DataBind
方法本身。
参考:
答案 1 :(得分:1)
当您尝试在Control中绑定数据时,您需要另一种语法。
<asp:HiddenField ID="hfOrg" runat="server" Value='<%# org %>' />
如果该控件位于Repeater / GridView等之外,则需要在Page_Load中调用DataBind()
。
protected void Page_Load(object sender, EventArgs e)
{
DataBind();
}