0

我正在母版页内的 ASP.Net 页面上实现 Javascript 验证。控件 ID 正在更改,因此我无法使用原始控件 ID 进行验证。我在网上查看并得到了动态构建脚本的建议,并使用 RegisterStartupScript 将其添加到页面中。我不喜欢那个解决方案,因为它不可维护。

我可以通过哪些方式在此页面上执行 javascript 验证并安排客户端 ID?

另一个解决方案只是要求我继续使用浏览器中显示的最终客户端 ID。这是可行的,我更喜欢在运行时创建脚本。你怎么看?

4

6 回答 6

2

IMO,复制出现在浏览器中的最终 ClientID 值是等待发生的麻烦。如果您更改代码中的控件 ID 并忘记在 javascript 中更改它,您可能不会注意到,直到验证神秘地停止工作。通过动态构建它,您至少会从编译时错误中受益。

当我需要在 javascript 中访问控件的客户端 ID 时,我在页面顶部放置了一个脚本块:

<script>
    var SomeControl = <%= Control1.ClientID %>;
    var AnotherControl = <%= Control2.ClientID %>;
    // etc, etc.
</script>

不幸的是,它仍然感觉像一个丑陋的黑客。ASP.NET 的未来版本应该会解决这种情况。

于 2008-12-27T06:09:25.500 回答
2

最佳解决方案取决于您的具体情况。在 Asp.Net 表单中处理验证的最简单和最易于维护的方法是使用内置验证控件。这些获取您要验证的控件的 ID,然后在该控件上提供客户端 (javascript) 和服务器端验证。他们为您处理自动接线和 javascript 创建。

如果这些由于某种原因不起作用并且您想在 javascript 中编写自己的验证函数,那么您需要使用类似于上述 Brant 解决方案的东西。正如布兰特所说,使用

<%= Control1.ClientID%>
在您的 javascript 中优于从浏览器源复制最终呈现的控件 ID,因为控件的最终 ID 会根据许多因素而变化,包括控件的 ID 和可能嵌套在其下方的任何父控件的 ID (用户控件、网格、中继器等)。.ClientID 将为每种情况输出控件的最终呈现 ID。这种技术可能看起来像一个肮脏的黑客,但它实际上是一种非常干净的方法来处理内置于框架中的 ID 重写以防止命名冲突。这是许多网站上使用的标准技术。

于 2008-12-27T06:44:30.017 回答
1

通过内联代码(例如 <% %> 标记)引用 ClientID 是完全可以接受的。但是,给出的示例不会真正起作用;你需要访问 DOM...

<script language="javascript" type="text/javascript">
  var control = document.getElementById('<%= control.ClientID %>');
</script>
于 2008-12-27T06:46:06.643 回答
1

另一种方法,虽然性能不高,是使用 JQuery。

在您要查找的每个控件中放置一个自定义 css 类。如果它是一个文本框,它可能如下所示:

< asp:TextBox id="NameTextBox" runat="server" cssClass="NameTextBox" >

这应该像这样点击浏览器:

< input id="something_NameTextBox" type="text" class="NameTextBox" >

然后,使用 JQuery,您可以找到这样的控件:

$(".NameTextBox")

您可以使用以下方法获取文本框的值:$(".NameTextBox").val()

这不是那么高效,通过 ID 查找控件更快,但如果页面不是太大,这将正常工作。

于 2008-12-27T18:24:45.267 回答
1

js 代码有两点需要满足: 1. 在方便的 JS 编辑器中编辑 JS 代码。(例如VS) 2.安全的多个控制实例共存。

有一个通用的方法来提供这两个东西:分开

  • 公共代码,独立于客户端 ID
  • 取决于具体 ID 的代码。

如果计划很少更改,公共代码可以存储为 .js 文件或网络资源。ID 相关代码可以按照 Brant 的回答进行排列,例如

   <script>
       var <%=c1.ClientID %> = new SomeJsClass(<%=c1.ClientID %>);
       var <%=c2.ClientID %> = document.getElementById('<%=c1.ClientID %>');
   </script>

处理这些变量的代码可能位于单独的 .js 文件中。

于 2008-12-29T09:47:33.420 回答
0

以下是我使用的两种方式:

在主人:

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);
于 2008-12-27T06:49:24.687 回答