根据 属性 后面的代码将带有 runat="server" 的输入设置为禁用

Set input with runat="server" to disabled based on code behind property

我正在尝试禁用具有 runat="server" 属性的 input。这应该基于 属性 后面的代码。这是我在新的 .NET 3.5 Web 窗体项目中的场景的最小重现:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.IsReadOnly = true;
    }

    public bool IsReadOnly { get; set; }
}
<%= IsReadOnly %>
<input value="testing" runat="server" id="myinput" disabled="<%# IsReadOnly %>"/>

输入呈现为禁用。

我做错了什么?我尝试了各种方法都没有效果,包括这些:

如何根据 属性 后面的代码在 aspx 中禁用 input

所以,这里有几点需要注意:

  1. <%# 将仅在数据绑定上下文中工作,所以不是你的情况
  2. <%= 等同于 Response.Write,所以同样不是你的情况,因为它不能操纵服务器端控件属性
  3. 在调用 Load 之前处理标记,因此您的初始化可能会晚到您想要的。

最好的办法就是在代码隐藏中禁用此功能 - 这是设置非数据绑定控件属性的唯一好方法。你可以直接在setter里做,像这样:

private bool _isReadOnly;
public bool IsReadOnly
{
    get { return _isReadOnly; }
    set
    {
        myinput.Disabled = value;
        _isReadOnly = value;
    }
}

而且您可能不需要 getter,因此毕竟不需要私有字段。