控件属性中的变量

本文关键字:变量 属性 控件 | 更新日期: 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>

这只是为了向你表明这并不难。但是,请查看我链接到的教程,以查看如何根据所分配的属性等处理方法的预期返回类型的示例。