我正在母版页内的 ASP.Net 页面上实现 Javascript 验证。控件 ID 正在更改,因此我无法使用原始控件 ID 进行验证。我在网上查看并得到了动态构建脚本的建议,并使用 RegisterStartupScript 将其添加到页面中。我不喜欢那个解决方案,因为它不可维护。
我可以通过哪些方式在此页面上执行 javascript 验证并安排客户端 ID?
另一个解决方案只是要求我继续使用浏览器中显示的最终客户端 ID。这是可行的,我更喜欢在运行时创建脚本。你怎么看?
我正在母版页内的 ASP.Net 页面上实现 Javascript 验证。控件 ID 正在更改,因此我无法使用原始控件 ID 进行验证。我在网上查看并得到了动态构建脚本的建议,并使用 RegisterStartupScript 将其添加到页面中。我不喜欢那个解决方案,因为它不可维护。
我可以通过哪些方式在此页面上执行 javascript 验证并安排客户端 ID?
另一个解决方案只是要求我继续使用浏览器中显示的最终客户端 ID。这是可行的,我更喜欢在运行时创建脚本。你怎么看?
IMO,复制出现在浏览器中的最终 ClientID 值是等待发生的麻烦。如果您更改代码中的控件 ID 并忘记在 javascript 中更改它,您可能不会注意到,直到验证神秘地停止工作。通过动态构建它,您至少会从编译时错误中受益。
当我需要在 javascript 中访问控件的客户端 ID 时,我在页面顶部放置了一个脚本块:
<script>
var SomeControl = <%= Control1.ClientID %>;
var AnotherControl = <%= Control2.ClientID %>;
// etc, etc.
</script>
不幸的是,它仍然感觉像一个丑陋的黑客。ASP.NET 的未来版本应该会解决这种情况。
最佳解决方案取决于您的具体情况。在 Asp.Net 表单中处理验证的最简单和最易于维护的方法是使用内置验证控件。这些获取您要验证的控件的 ID,然后在该控件上提供客户端 (javascript) 和服务器端验证。他们为您处理自动接线和 javascript 创建。
如果这些由于某种原因不起作用并且您想在 javascript 中编写自己的验证函数,那么您需要使用类似于上述 Brant 解决方案的东西。正如布兰特所说,使用
<%= Control1.ClientID%>
在您的 javascript 中优于从浏览器源复制最终呈现的控件 ID,因为控件的最终 ID 会根据许多因素而变化,包括控件的 ID 和可能嵌套在其下方的任何父控件的 ID (用户控件、网格、中继器等)。.ClientID 将为每种情况输出控件的最终呈现 ID。这种技术可能看起来像一个肮脏的黑客,但它实际上是一种非常干净的方法来处理内置于框架中的 ID 重写以防止命名冲突。这是许多网站上使用的标准技术。
通过内联代码(例如 <% %> 标记)引用 ClientID 是完全可以接受的。但是,给出的示例不会真正起作用;你需要访问 DOM...
<script language="javascript" type="text/javascript">
var control = document.getElementById('<%= control.ClientID %>');
</script>
另一种方法,虽然性能不高,是使用 JQuery。
在您要查找的每个控件中放置一个自定义 css 类。如果它是一个文本框,它可能如下所示:
< asp:TextBox id="NameTextBox" runat="server" cssClass="NameTextBox" >
这应该像这样点击浏览器:
< input id="something_NameTextBox" type="text" class="NameTextBox" >
然后,使用 JQuery,您可以找到这样的控件:
$(".NameTextBox")
您可以使用以下方法获取文本框的值:$(".NameTextBox").val()
这不是那么高效,通过 ID 查找控件更快,但如果页面不是太大,这将正常工作。
js 代码有两点需要满足: 1. 在方便的 JS 编辑器中编辑 JS 代码。(例如VS) 2.安全的多个控制实例共存。
有一个通用的方法来提供这两个东西:分开
如果计划很少更改,公共代码可以存储为 .js 文件或网络资源。ID 相关代码可以按照 Brant 的回答进行排列,例如
<script>
var <%=c1.ClientID %> = new SomeJsClass(<%=c1.ClientID %>);
var <%=c2.ClientID %> = document.getElementById('<%=c1.ClientID %>');
</script>
处理这些变量的代码可能位于单独的 .js 文件中。
以下是我使用的两种方式:
在主人:
Page.ClientScript.RegisterClientScriptInclude("somescript", ResolveUrl("some.js"));
以编程方式:
HtmlGenericControl JScript1 = new HtmlGenericControl("script");
JScript1.Attributes.Add("type", "text/javascript");
JScript1.Attributes.Add("src", ResolveUrl("some.js"));
this.Page.Header.Controls.Add(JScript1);