我需要用一些其他地方的属性来初始化文本框元素的text属性,实际上我可以从代码中执行此操作,但如果可以这样做会更方便:
<asp:TextBox runat="server" Text="<%= new ContextItem("title").Value %>" />
不幸的是,上述情况无法完成。
问题是这个文本框元素在页面中重复多次,我的问题是:
是否有任何建议如何使其更清洁,然后在后面的代码中反复写入?
谢谢,
阿德勒
答案 0 :(得分:3)
好的,所以这里的基本问题是如果使用内联表达式,则不能使用它来设置绑定上下文之外的服务器端控件的属性(使用绑定表达式)。我推断这可能是因为评估这些内联表达式的时间。但是,您可以通过这种方式呈现客户端标记。如果您希望将功能完全保留在您的aspx文件中,则可以使用此方法。
编辑:根据Justin Keyes的输入,似乎可以使用绑定表达式来设置属性。您需要手动调用Page.DataBind()
来触发文本框来评估表达式(请参阅下面的答案)。
例如:
<asp:Label ID="lbl" runat="server" Text="<%= Now.ToShortDateString() %>" />
将产生此输出:
&lt;%= Now.ToShortDateString()%&gt;
另一方面,这个:
<%= "<span>" & Now.ToShortDateString() & "</span>"%>
将产生此输出:
2011年7月27日
解决此问题的“正常”方法是根据您的需要在Label.Text
事件处理程序或其他适当的事件处理程序中设置Page.Load
属性,如下所示。这是我认为大多数人更愿意这样做的方式,在我看来最容易理解。
标记:
<asp:Label ID="lbl" runat="server" />
代码:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
lbl.Text = Now.ToShortDateString()
End Sub
答案 1 :(得分:2)
选项1:不使用服务器控件
如果您没有访问服务器上的值,只需使用纯HTML而不是ASP.NET服务器控件:
<input ID="Textbox1" Type="Text"
Value='<%= new ContextItem("title").Value %>' />
选项2:使用Page.DataBind()
如果您将代码更改为使用<%#
而不是<%=
(如下所示)并致电Page.DataBind()
,那么将工作(我已对其进行了测试) )。将您的标记更改为:
<asp:TextBox runat="server" Text="<%# new ContextItem("title").Value %>" />
在你的逻辑中,在Load事件中调用Page.DataBind()
,如下所示:
protected void Page_Load(object sender, EventArgs e) {
Page.DataBind();
}
即使TextBox未包含在典型的“数据绑定”控件(如Repeater或GridView)中,在控件上调用DataBind()
也会强制它评估{{1} }陈述。
Moof的评论(如下)是正确的。 This post还提到了Page.DataBind()。
答案 2 :(得分:2)
您可以用类似的方式在页面上设置文字。
<asp:TextBox id="TextBox1" runat="server" Text='<%#GetValue('Title)%>' />
但为了使其正常工作,您需要在Page_Load上使用DataBind控件。对于多个TextBox控件,您可以遍历每个控件并对其进行数据绑定,这样您就不必对每个控件进行硬编码。
我不确定你的ContextItem是什么,所以你必须修改我的代码。
答案 3 :(得分:1)
简短的回答是NO,你只能在数据绑定中使用这种代码,例如在GridView中。但你可以在头部使用它。
我用它来为我的网址添加前缀,有时会预定义。实施例
<script src="<%=Utils.GetGeneralPrefix()%>/Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
在这种情况下,它有效。
希望它有所帮助。
答案 4 :(得分:0)
当我尝试这个时,90%的时间我必须在&lt; %%&gt;周围使用单引号('')而不是双引号(“”)。在花费太多时间在其他任何事情之前尝试一下。