【问题标题】:What's the best way to do javascript validation on ASP.Net page with Masterpage?使用 Masterpage 在 ASP.Net 页面上进行 javascript 验证的最佳方法是什么?
【发布时间】:2008-12-27 05:56:51
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • Asp.Net 4.0 应该为所有 ASP.Net Web 控件提供一个可设置的 ClientId(与我们现在一样生成的 ClientId),这就是变化。而且它不是 hack,不要害怕 ,否则你不会喜欢 asp.net mvc。
    • 另一种设置 javascript 的替代方法是使用页面脚本控件从代码隐藏中发出一个脚本块。
    【解决方案2】:

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

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

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

    【讨论】:

    • 对我来说并不像黑客。
    【解决方案3】:

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

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

    【讨论】:

    • 你好,我喜欢罗伯特的这个解决方案。谢谢。
    【解决方案4】:

    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】:

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

      在您要查找的每个控件中放置一个自定义 css 类。 如果它是一个文本框,它可能看起来像这样:

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

      这应该像这样进入浏览器:

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

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

      $(".NameTextBox")
      

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

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

      【讨论】:

        【解决方案6】:

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

        在主人:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多