Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';使用母版页在ASP.Net页面上进行javascript验证的最佳方法是什么?_.net_Asp.net_Javascript_Master Pages - Fatal编程技术网

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

什么';使用母版页在ASP.Net页面上进行javascript验证的最佳方法是什么?,.net,asp.net,javascript,master-pages,.net,Asp.net,Javascript,Master Pages,我正在母版页内的ASP.Net页面上实现Javascript验证。控件ID正在更改,因此我无法使用原始控件ID进行验证。我在网上查看了一下,得到了动态构建脚本的建议,并使用RegisterStartupScript将其添加到页面中。我不喜欢这个解决方案,因为它是不可维护的 我可以通过什么方式在此页面上执行javascript验证并安排客户端ID 另一个解决方案要求我继续使用浏览器中显示的最终clientid。这是可行的,我更喜欢在运行时创建脚本。您的看法是什么?在我看来,复制浏览器中显示的最终C

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

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


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

在我看来,复制浏览器中显示的最终ClientID值是一件很麻烦的事情。如果您在代码中更改了控件ID,而忘记在javascript中更改它,那么在验证神秘地停止工作之前,您可能不会注意到。通过动态构建它,您至少可以从编译时错误中获益

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

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

var-SomeControl=;
var AnotherControl=;
//等等等等。

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

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


如果出于某种原因,这些方法不起作用,并且您想用javascript编写自己的验证函数,那么您需要使用类似于上述Brant解决方案的方法。正如Brant所提到的,在javascript中使用
优于从浏览器源代码复制最终呈现的控件ID,因为控件的最终ID会根据许多因素发生变化,包括控件的ID和它可能嵌套在下面的任何父控件的ID(用户控件、网格、中继器等).ClientID将为每种情况输出控件的最终呈现ID。这种技术看起来像是一种肮脏的攻击,但实际上它是一种非常干净的方法,用于处理内置在框架中的ID重写,以防止命名冲突。这是许多网站上使用的标准技术。

这是完全可以接受的能够通过内联代码(例如标记)引用ClientID。不过,给出的示例并不真正有效;您需要访问DOM

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

var control=document.getElementById(“”);
以下是我使用的两种方法:

在母版中:

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);

另一种方法是使用JQuery,尽管性能不如JQuery

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

< asp:TextBox id="NameTextBox" runat="server" cssClass="NameTextBox" >
< input id="something_NameTextBox" type="text" class="NameTextBox" >
$(".NameTextBox")
您可以使用以下命令获取文本框的值:
$(“.NameTextBox”).val()


这不是很好,按ID查找控件更快,但如果页面不太大,这将很好。

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

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

  • 公共代码,即独立的 来自客户端ID
  • 依赖于 具体身份证
如果计划很少更改,公共代码可以存储为.js文件或web资源。 依赖IDs的代码可以按照布兰特的回答进行排列,如

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

var=newsomejsclass();
var=document.getElementById(“”);

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

您好,我喜欢这个解决方案,Robert。谢谢。我觉得这不像是黑客攻击。Asp.Net 4.0应该有一个可设置的ClientId(而不是像我们现在这样生成的ClientId)对于所有ASP.Net web控件来说,这就是变化。这不是黑客行为,不要担心,否则您将不喜欢ASP.Net mvc。另一种类似于设置javascript的方法是使用页面脚本控件从代码后面发出scriptblock。