使用Masterpage在ASP.Net页面上进行javascript验证的最佳方法是什么?

时间:2008-12-27 05:56:51

标签: .net asp.net javascript master-pages

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

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

另一个解决方案只是让我继续使用浏览器中显示的最终clientID。这是可行的,我更喜欢它在运行时创建脚本。你有什么看法?

6 个答案:

答案 0 :(得分:2)

IMO,复制出现在浏览器中的最终ClientID值很难等待。如果您更改了代码中的控件ID而忘记在javascript中更改它,则在验证神秘地停止工作之前您可能不会注意到。通过动态构建它,您至少可以获得编译时错误的好处。

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

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

不幸的是,它仍然感觉像是一个丑陋的黑客。 ASP.NET的未来版本应该可以解决这个问题。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

<script language="javascript" type="text/javascript">
  var control = document.getElementById('<%= control.ClientID %>');
</script>

答案 3 :(得分:1)

另一种不是高效的方法是使用JQuery。

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

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

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

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

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

$(".NameTextBox")

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

这不是高效的,通过ID查找控件的速度更快,但如果页面不是太大,这样就可以正常工作。

答案 4 :(得分: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文件中。

答案 5 :(得分:0)

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

在主人:

Page.ClientScript.RegisterClientScriptInclude("somescript", ResolveUrl("some.js"));

programmically:

HtmlGenericControl JScript1 = new HtmlGenericControl("script");
JScript1.Attributes.Add("type", "text/javascript");
JScript1.Attributes.Add("src", ResolveUrl("some.js"));
this.Page.Header.Controls.Add(JScript1);