javascript - 在 OnChange 事件上使用 javascript 验证 gridview 中的文本框(不起作用)

标签 javascript asp.net gridview

我是 javascript 的新手,我想使用 javascript 函数来验证文本框中的数据。

我有 1 个文本框 (txtScore)、1 个标签 (lblMark) 和 1 个标签 (lblValidation)。 当分数高于标记时,我希望 JavaScript 中的 ScoreValidation 函数触发,并在 lblValidation 中显示一条消息。

我的文本框位于 GridView 中。 gridview 在一个控件中,我正在开发一个 asp.net 项目。

这是我迄今为止可以控制的代码:

<asp:ObjectDataSource  ID="DS" runat="server" TypeName="BLL.MAnswer" DataObjectTypeName="DTO.MAnswer" 
    SelectMethod="Select" InsertMethod="Update" UpdateMethod="Update" DeleteMethod="Update">
    <SelectParameters>
        <asp:ControlParameter Name="MAppID" ControlID="lblMAppID" Type="Int16" />
    </SelectParameters>
</asp:ObjectDataSource>

<asp:GridView ID="GVQuestion" runat="server" SkinID="QuestionGrid" DataSourceID="DS">
<Columns>

    <asp:TemplateField ItemStyle-VerticalAlign="Top">
        <ItemTemplate>
            <asp:Label ID="lblValidation" runat="server" ForeColor="Red" />
            <asp:Label ID="lblMark"  Text='<%# Eval("Mark") %>' runat="server"/>
            <asp:TextBox ID="txtScore" runat="server" Text='<%# Eval("Score") %>' OnChange="ScoreValidation()"/>
        </ItemTemplate>
    </asp:TemplateField>
</Columns>
</asp:GridView>

<script type="text/javascript">
   function ScoreValidation() {
        var Score = document.getElementById('txtScore').value;
        var Mark = document.getElementById('lblMark').value;
        var Validation = "Score cannot be higher than mark";

        if (Score > Mark) document.getElementById('lblValidation').value = "Score cannot be higher than mark";
    }

最佳答案

虽然已经太晚了,但我想我应该留言以供其他 Google 员工将来引用。

我同意 Csdtesting 的答案,这是最简单的。但是,我不同意他的观点,因为他说这不能通过 JavaScript 完成。以下是在 JavaScript 中执行此操作的方法。客户端验证可以使用 JavaScript 完成,因为最终所有服务器控件都会呈现为 HTML。甚至 RangeValidator 也使用 JavaScript 进行验证。您的路径是正确的,只是不知道如何获取每个控件的 id。没关系,你会到达那里:-)

以下是在普通 JavaScript 中执行此操作的方法。 (在给你工作代码后我会解释)

你的脚本应该像这样修改。请注意,您的函数现在接受一个参数。 (代码是不言自明的,我尝试在可能的情况下添加注释。)

<script type="text/javascript">
              /*
                obj - txtScore object
              */
              function ScoreValidation(obj) {
                  // Create all your objects based on the obj object (in this case it's the html object of txtScore text box)
                  var txtScore = document.getElementById(obj.id);
                  var lblMark = document.getElementById(obj.id.replace('txtScore', 'lblMark'));
                  var lblValidation = document.getElementById(obj.id.replace('txtScore', 'lblValidation'));

                  // Now get the values to compare
                  var Score = txtScore.value;
                  var Mark = lblMark.innerHTML; // Labels (ultimately becomes Spans doesn't have a value. therefore you need to use inner HTML)

                  // You need to convert Mark to int since you cannot compare two data types (I.e. int vs html)
                  if (Score > parseInt(Mark)) {
                      lblValidation.innerHTML = "Score cannot be higher than mark";
                      txtScore.focus(); // Don't leave the text box until user fix the validation issue
                  }
                  else {
                        // reset your validation message label if all is good
                      lblValidation.innerHTML = "";
                  }
              }
          </script>

然后在您的标记代码中,而不是仅调用不带参数的 JavaScript 函数,传递当前对象(即 thisJavaScriptthis 代表当前对象)。

<asp:TextBox ID="txtScore" runat="server" Text='0' onBlur="ScoreValidation(this)"/>

请注意,我使用了 onBlur 而不是 OnChange 事件,因为它可以更好地进行验证。 (并且,当您编写客户端事件时,请以简单的大小写而不是大写字母开头。这将服务器端事件与客户端事件区分开来。这并不重要,但更好:-))

进一步说明

首先,您必须了解,您的服务器端控件将转换为等效的 html,并且每个控件都有一个 ID(您在控件创建或设计时定义的 ID,以及由服务器)、UniqueID(服务器使用的唯一 ID)和 ClientID(服务器将呈现给客户端的 ID。这是您需要的 ID)需要在 JavaScript 中唯一标识每一行中的元素)。

其次,您必须了解服务器端和客户端都存在对象层次结构。因此,当服务器决定控件的 ClientID 时,它会考虑此服务器端对象层次结构。而且,由于您的控件位于 GridView 内,因此它还会考虑行号(从 0 开始)。然后它会输出一个唯一的 id。

例如第一行的 txtScore 文本框的 ClientID 为

GVQuestion_txtScore_0 

请注意,如果您的 GridView 包含在另一个对象或 UserControl 等中,并且您在多个服务器上运行应用程序,则情况可能会略有不同。所以它变得复杂:-)

但是,JavaScript 消除了您所有的担忧,并为您提供了this。这代表当前的客户端对象。

希望您能理解并学到一些东西。

学习 JavaScript 一切顺利:-)

关于javascript - 在 OnChange 事件上使用 javascript 验证 gridview 中的文本框(不起作用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26049483/

相关文章:

支持全局事件的 Javascript ajax 库

javascript - 使用 javascript 查找并替换 utf 字符

c# - 如何在 rowdatabound 事件的 GridView 中检查状态(真/假)?

c# - ASP.NET MVC 大型项目架构

c# - 在 ASP.NET 中嵌入饼图(Razor 语法)

c# - 无法使用 gridview 正确排序数据 int

javascript - 重绘方法不刷新极坐标图

javascript - 如何在定界字符串中查找数字字符串

java - 我无法在 Android Fragment 中使用 textview 填充 gridview

c# - 在 GridView 编辑中, "Input string was not in a correct format"