【问题标题】:How to protect an asp:textbox from user input?如何保护 asp:textbox 免受用户输入的影响?
【发布时间】:2014-04-01 13:30:26
【问题描述】:

如何保护 asp:textbox 免受用户输入的影响?

禁用它

<asp:TextBox ID="txbx" runat="Server" Text="1" Enabled="false" />

保护它

<asp:TextBox ID="txbx" runat="Server" Text="1" ReadOnly="true" />

我希望保护上面的文本框不受用户输入的影响,但仍然允许使用 javascript 更新值。

这很好用,有什么问题?

问题

如果文本框是disabledreadonly,则更新的值在提交时不会发布到服务器!

问题

如何创建一个可以同时进行的文本框:

  • 对用户可见。

  • 防止用户输入。

  • 用 javascript 更新。

  • 将更新后的值发布到服务器。


回答

发生冲突是因为当您在控件上设置enabled="false" 时,它不会将值传递给服务器。

但是设置disabledreadonly 客户端不会导致此问题。

您可以使用以下方法设置属性客户端:

后面的代码中:

txbx.Attributes.Add("ReadOnly", "ReadOnly")
txbx.Attributes.Add("disabled", "disabled")

或通过使用客户端控件并将它们设置为运行服务器:

<input type="text" id="txbx" readonly="readonly" runat="server" />
<input type="text" id="txbx" disabled="disabled" runat="server" />

【问题讨论】:

  • 这是 vb 还是 C#。我可以用 Visual Basic 告诉你。然后你可以转换成C#,如果是C#的话,有很多VB到C#的转换器。
  • 您确定更新的值不会被回发吗?我使用了 ReadOnly = "true" 并使用 jQuery 进行了更新,从未出现过问题。
  • @KashishArora VB 更好,谢谢
  • @Mych 是的,删除只读后一切正常。这是来自此处的后续帖子:stackoverflow.com/questions/22095888/…
  • 经过一些试验标准 asp:TextBox 不会回发客户端更新值,而 ReadOnly = True 但 Telerik Texbox 控件可以。我广泛使用 Telerik,因此当您遇到此问题时感到困惑。

标签: c# asp.net vb.net readonly disabled-control


【解决方案1】:

我曾经通过在代码隐藏中设置ReadOnly 属性来摆脱这种情况。您可以尝试一次。

txbx.Attributes.Add("ReadOnly", "ReadOnly");

在您的Page_Load 事件中添加这行代码。

请告知它是否适合您。

【讨论】:

  • Downvote 有点苛刻,因为这实际上以最干净和最有效的方式解决了问题。顺便说一句,这不是我。
  • 对我来说,这不起作用,因为 'txtbx' 控件尚未启动,并且使用 DetailsView.FindControl() 总是在 Page_Load 事件中返回 null。还有其他建议吗?
  • 如果您在 Page_Load() 事件中编写此代码,您的控件应该已经启动。如果您要动态创建此控件,请在启动逻辑之后编写此代码。那应该行得通。如果您分享您的代码,这将很有帮助。 @费尔南多68
  • 提醒:如果这不是您的问题,请不要投反对票,因为它不适合您。
【解决方案2】:

在我看来,最简单的解决方案是有一个隐藏字段并在回发时读取它,这样受保护的文本框只是装饰性的,实际逻辑是使用隐藏字段。

也就是说,ReadOnly = true 仍然可以在回发上工作,只有 Enabled = false 不应该回发值。

【讨论】:

  • 我曾考虑过这一点,但希望有一个代码效率更高的解决方案。
【解决方案3】:

由于某种原因不是很清楚,但是 ASP.NET 有一个特殊的属性可以控制是否将禁用的控件发送回服务器:HtmlForm.SubmitDisabledControls

因此,您要做的就是将此属性设置为 true 以供您的 Form 控件使用

<form id="form1" submitdisabledcontrols="true" runat="server">
    <asp:TextBox ID="txbx" runat="Server" Text="1" ReadOnly="true" Enabled="false" />
</form>

【讨论】:

  • @DreamTeK 把它放在你的问题中,以及其他可能相关的细节。
  • 感谢您的帮助。我没有添加这个属性,因为在我之前的帖子中,我知道 submitdisabledcontrols 不会使用 javascript 提交更新的值。所以我创建了这篇文章以防止混淆。 stackoverflow.com/questions/22095888/…
【解决方案4】:

您可以改用 html input 元素,并将 runat 属性设置为 server 以从 server 引用它,如下所示:

<input type="text" name="name" id="text2" readonly="readonly" runat="server" />

它的值,在客户端修改后发送到服务器,设置为readonly

【讨论】:

  • @DreamTeK 是的,我可以,这肯定有帮助,当我发布此内容时,您的编辑尚未加载...
【解决方案5】:

注意:&lt;form&gt; 不会为禁用的输入发送数据。

我的个人解决方案:

  • 使用 JS 使原始字段不可见
  • 使用原始值写入新字段并将其禁用,仅用于显示。

    var status = document.getElementById("ElementID");
    status.style.visibility='hidden';
    var row = status.parentNode.parentNode;
    var newCol = row.insertCell(-1);
    newCol.innerHTML = "<div style='padding-left: 6px'><input readonly='readonly' type='text' size='50' value='" + status.value + "' class='inputReadOnly'/></div>";
    

【讨论】:

    【解决方案6】:

    对用户可见。

    <asp:TextBox ID="txbx" runat="Server" />
    

    防止用户输入。

    <asp:TextBox ID="txbx" runat="Server" Text="1" Enabled="false" />
    <asp:TextBox ID="txbx" runat="Server" Text="1" ReadOnly="true"  />
    

    使用 javascript 进行更新。
    创建一个函数并使用like

    <script type="text/javascript">
            var a = ($("#<%=txbx.ClientID%>"));
            a.value="assas";
    </script>
    

    将更新后的值发布到服务器。
    同上

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 2021-11-18
      相关资源
      最近更新 更多