【问题标题】:ASP.NET Detect if Javascript disabled fieldASP.NET 检测是否禁用 Javascript 字段
【发布时间】:2012-10-30 16:32:21
【问题描述】:

我希望有一个答案...

设置: 相当复杂的 ASP.NET 应用程序进行大量用户交互,其中一些要求 Javascript 在单击其他字段时禁用某些字段(必须在 Javascript 中执行,b/c ASP.NET 中的回发问题使其不可能,所以有到客户端)。

该代码在 Javascript 的经典之处都很好 document.getElementById(currObj).disabled = true;

问题: 当我准备好提交页面时,如何让 ASP.NET (C#) 通知客户端是否已禁用字段(文本框或单选框),因此它不会在表单中提交该字段? 这甚至可能吗?

提前非常感谢!

【问题讨论】:

  • 禁用的字段会自动在表单中提交。你不能检查 C# 中的.Enabled 属性吗?我忘记了是否使用客户端设置它实际上会传播到服务器(我猜它不会)。无论如何,您始终可以将隐藏变量的值设置为禁用时控件的 ID - 然后在服务器上检查该值。您还可以检查 ID 是否在发布的查询字符串中(而不是使用 Textbox1.Enabled) - 只有在未禁用时才会出现。

标签: javascript asp.net


【解决方案1】:

任何禁用的字段都不会提交,但正常甚至隐藏的字段都会提交。这就是禁用字段的工作方式。

<input type="text" name="Test_1" value="off" disabled="disabled" />
<input type="text" name="Test_2" value="on" />
<input type="hidden" name="Hidden_1" value="hide_off" disabled="disabled" />
<input type="hidden" name="Hidden_2" value="hide" />

在示例中,只有 Test_2Hidden_2 会提交,因为其他人都被禁用了。

你可以在这个 jsfiddle 中看到它的作用:http://jsfiddle.net/bJ7Rq

【讨论】:

  • Hmm.. Asp.net 似乎并不关心他们被禁用(或者它没有注意到 b/c Javascript 在没有回发的情况下进行了更改),这就是我的观点,它即使 javascript 禁用它也会提交它们。
  • @WinFiddle 如果 ASP 不使用简单的表单提交(这将尊重禁用状态),那么它比我想象的更落后。
  • @TheZ:很确定信息(禁用状态等)来自 ViewState,而不是表单本身。如果您使用 Request.Form,它将看起来像任何其他健全的框架,不包括禁用的输入;) (IIRC)
【解决方案2】:

ASP.NET 知道某个控件已被禁用的唯一方法是它是否已从 .NET 中被禁用并且 Enabled = false 属性已写入 ViewState。当您在客户端禁用字段时,情况并非如此,因此 ASP.NET 将保留默认的 Enabled 值。

正如之前的评论者所提到的,禁用字段的值将完全排除在回发时发送到服务器的 POST 正文中。对于页面上的基本TextBox,这意味着Text 属性将恢复为String.Empty。为了区分启用字段中的空字符串和实际禁用字段,我认为您需要直接查看 Request.Form 对象以查看密钥是否存在。例如,如果我在空白页上有一个名为 myTextBoxTextBox,则对于禁用的字段,Request.Form["myTextBox"] 将是 null。对于启用的字段,它将是该字段包含的任何字符串值,包括 String.Empty 如果它是空白的。当然,如果控件位于与 HTML 中实际字段上的 name 属性混淆的命名容器(例如,ContentPlaceholder 或其他东西)中,则您需要使用完整的 HTML name

例如:

bool fieldIsEnabled = Request.Form["myTextBox"] == null;

它并不优雅,但它应该可以完成工作(不包括复选框,如果未选中该框,它也将是 null)。

【讨论】:

  • 啊,旧 ASP 时代的旧 Request.Form,我忘了它仍然适用于 .NET 框架...非常有趣的方法,谢谢 George!
  • 不客气!如果这是您最终得到的解决方案,请随时为未来的读者接受这个答案。如果你发现更好的东西,请分享。 :)
猜你喜欢
  • 2011-10-13
  • 1970-01-01
  • 2011-02-25
  • 2010-09-19
  • 1970-01-01
  • 2013-11-03
  • 2011-02-02
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多