控件属性中的变量
本文关键字:变量 属性 控件 | 更新日期: 2023-09-27 18:26:49
此代码:
<asp:TextBox runat="server" MaxLength="<%=Settings.UsernameMaxLength %>" ID="Username"/>
引发解析程序错误。
是否可以在不使用代码的情况下以类似的方式设置属性?
不,这是不可能的。语法<%= some code here %>
不能与服务器端控件一起使用。您可以使用<%# some code here %>
,但仅在数据绑定的情况下使用,也可以在代码后面设置此属性,例如Page_Load
:
protected void Page_Load(object source, EventArgs e)
{
Username.MaxLength = Settings.UsernameMaxLength;
}
您可以尝试这样做,它应该在渲染时设置MaxLength值:
<%
Username.MaxLength = Settings.UsernameMaxLength;
%>
<asp:TextBox runat="server" ID="Username"/>
我认为(没有尝试)你也可以写:
<asp:TextBox runat="server" MaxLength="<%#Settings.UsernameMaxLength %>" ID="Username"/>
但是您需要在代码后面的某个地方call Username.DataBind()
。
我来这里参加聚会迟到了,但还是来了。。。
您可以构建自己的Expression Builder
来处理这种情况。这将允许您使用这样的语法:
<asp:TextBox
runat="server"
MaxLength="<%$ MySettings: UsernameMaxLength %>"
ID="Username"/>
注意$
符号。
要学习如何制作自己的Expression Builder
,请阅读这篇古老但仍然相关的教程。不要让文字墙吓跑你,因为最终,制作一个表达式生成器很容易。它基本上包括从System.Web.Compilation.ExpressionBuilder
派生一个类并重写GetCodeExpression
方法。这里有一个非常简单的例子(这个代码的某些部分是从链接的教程中借来的):
public class SettingsExpressionBuilder : System.Web.Compilation.ExpressionBuilder
{
public override System.CodeDom.CodeExpression GetCodeExpression(System.Web.UI.BoundPropertyEntry entry, object parsedData, System.Web.Compilation.ExpressionBuilderContext context)
{
// here is where the magic happens that tells the compiler
// what to do with the expression it found.
// in this case we return a CodeMethodInvokeExpression that
// makes the compiler insert a call to our custom method
// 'GetValueFromKey'
CodeExpression[] inputParams = new CodeExpression[] {
new CodePrimitiveExpression(entry.Expression.Trim()),
new CodeTypeOfExpression(entry.DeclaringType),
new CodePrimitiveExpression(entry.PropertyInfo.Name)
};
return new CodeMethodInvokeExpression(
new CodeTypeReferenceExpression(
this.GetType()
),
"GetValueFromKey",
inputParams
);
}
public static object GetValueFromKey(string key, Type targetType, string propertyName)
{
// here is where you take the provided key and find the corresponding value to return.
// in this trivial sample, the key itself is returned.
return key;
}
}
为了在aspx页面中使用它,您还必须在web.config
:中注册它
<configuration>
<system.web>
<compilation ...>
<expressionBuilders>
<add expressionPrefix="MySettings" type="SettingsExpressionBuilder"/>
</expressionBuilders>
</compilation>
</system.web>
</configuration>
这只是为了向你表明这并不难。但是,请查看我链接到的教程,以查看如何根据所分配的属性等处理方法的预期返回类型的示例。