< %%>标签有时会起作用,有时候也不会

时间:2017-09-07 12:04:48

标签: c# asp.net .net

我的.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输入标签,而后者则由服务器呈现。但是我发现这是一种奇怪的行为,我也希望它能在第二种情况下发挥作用。

我哪里错了?

2 个答案:

答案 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();
}