【问题标题】:Set input with runat="server" to disabled based on code behind property根据属性后面的代码将带有 runat="server" 的输入设置为禁用
【发布时间】:2015-08-27 23:27:21
【问题描述】:

我正在尝试使用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 %>"/>

输入呈现为禁用。

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

  • disabled="&lt;%= IsReadOnly %&gt;":即使IsReadOnly = true 也不会禁用
  • disabled='&lt;%= IsReadOnly ? "disabled" : "" %&gt;':当IsReadOnly = false 时不起作用
  • &lt;%= IsReadOnly ? "disabled='disabled'" : "" %&gt; 标签内:解析器错误

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

【问题讨论】:

  • 为什么不在Page_Load 处理程序中执行myinput.Disabled = IsReadOnly?请注意,您不能在 runat="server" 元素中使用 &lt;%=
  • 这是我目前使用的解决方法。但是,因为 aspx 已经有很多其他类似的部分,所以我想将其 all 保留在那里(或者,当我在几个月后回到这个视图时,我可能会不知所措如何禁用输入)。

标签: c# asp.net webforms


【解决方案1】:

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

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

您最好的选择就是在后面的代码中禁用此功能 - 这是设置非数据绑定控件属性的唯一好方法。您可以直接在 setter 中执行此操作,如下所示:

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

而且你可能根本不需要 getter 和私有字段。

【讨论】:

  • 猜猜我对 MVVM-dope 如此着迷,我没有看到我的解决方法是这里的实际解决方案。
  • 附言。如果我在我的模型上使用IsReadOnly&lt;%# 可用的数据绑定上下文中,这将如何变化?或者我应该为此创建一个新的 SO 问题?
  • @Jeroen,如果您在数据绑定上下文中,例如在网格视图中,您的输入控件将在某种模板中,并且在后面的代码中不可用他们的身份证。在那种情况下,Disabled=&lt;%# IsReadOnly %&gt; 是正确的选择
猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多