【问题标题】:<% %> tags sometimes work, sometimes don't<% %> 标签有时有效,有时无效
【发布时间】:2017-09-07 20:11:32
【问题描述】:

我的 .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 %>' />

其中 org 是与上述类似的属性。但这呈现为:

<input type="hidden" name="ctl00$cs$hfOrg" id="cs_hfOrg" value="<%= org %>">

在同一个页面中。这两个控件都没有数据绑定或内部数据控件,它们也没有绑定到页面中的数据源。

我意识到第一种情况不是服务器控件,只是一个普通的HTML输入标签,而后者是由服务器渲染的。但是我发现这是一种奇怪的行为,我希望它也能在第二种情况下工作。

我哪里错了?

【问题讨论】:

标签: c# asp.net .net


【解决方案1】:

&lt;%= %&gt; 是 Response.Write 的快捷方式,它只能在像这里这样的纯 HTML 中工作

<input type="hidden" data-versus="PL"  value="<%= vs_pl %>" />

您应该在这样的服务器控件中使用 DataBindings

<input type="hidden" name="ctl00$cs$hfOrg" id="cs_hfOrg" value="<%# org %>">

请务必记住,如果您使用 DataBindings,则应直接或间接调用 UserControl 的 DataBind 方法,但应调用父控件或 Page 本身的 DataBind 方法。

参考:

【讨论】:

  • 我觉得奇怪的是
  • 这是因为 ASP.NET 解析器,长篇大论的评论。假设 ASP.NET 有一个正则表达式来查找带有 runat="server" 的元素,当它找到匹配项时,它将在那里注入 Control.Render() 输出(因此永远不会处理 的元素)没有 runat= "server" 将被忽略,然后所有 &lt;%=%&gt; 将在这些元素中处理。一个简单的runat="server" 改变了很多事情
【解决方案2】:

当您尝试在控件中绑定数据时,您需要另一种语法。

<asp:HiddenField ID="hfOrg" runat="server" Value='<%# org %>' />

如果该控件在Repeater/GridView 等之外,您需要在Page_Load 中调用DataBind()

protected void Page_Load(object sender, EventArgs e)
{
    DataBind();
}

【讨论】:

  • 但是它们都没有绑定到数据源。我不需要数据绑定——至少现在不需要。
  • 是的,否则org 的值不会绑定到控件。尝试使用和不使用DataBind() 的上述代码,您会发现hfOrg 内部没有任何值,即使您使用了&lt;%# org %&gt;
  • 我想我明白你想说什么,我以前使用过数据绑定表达式无数次。我想说的是,我们在同一个 aspx 页面中,我们具有相似的控件属性和相同的简写(),用于基本相同类型的控件(a hidden field) 工作一次,但在其以下 10 行处不起作用。只是因为一个是html控件,另一个是服务器控件。
  • 服务器控件和纯 html 从 webform 的角度来看是不一样的。只有当页面呈现给浏览器时,服务器控件才会呈现为html。
猜你喜欢
  • 2014-01-07
  • 2015-02-11
  • 2012-08-02
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多