【问题标题】:asp.net jscript Error: Unable to get property 'value' of undefined or null referenceasp.net jscript 错误:无法获取未定义或空引用的属性“值”
【发布时间】:2013-09-11 08:37:48
【问题描述】:

刚开始学习并在练习 jscript 时遇到这个问题

代码:

<script type="text/jscript" language="jscript">
    function MyClientFunction(sender, arguments) {
        var intValue = arguments.value;
        alert(arguments.value);
        if (intValue % 2 == 0) {
            arguments.IsValue = true;
        }
        else {
            alert("Use Even Numbers");
        }
    }
</script>

<asp:textbox ID="TextBox1" runat="server"></asp:textbox>
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="CustomValidator" ClientValidationFunction="MyClientFunction();" EnableClientScript="true"></asp:CustomValidator>
<asp:Button ID="Button1" runat="server" Text="Button"></asp:Button>

点击“按钮”后显示错误:

“...错误:无法获取未定义或空引用的属性'值'...”

不知道参数是怎么传的,不是很熟悉jscript函数是怎么工作的

试过了,没有错误:

var intValue = document.getElementById("TextBox1").value;
alert(intValue);

非常感谢..

【问题讨论】:

  • Javascript 不遵循 .Net 的 sender, args 约定。而arguments有特殊含义;您不应该将其用作名称。

标签: c# asp.net


【解决方案1】:

不要传递this。你不想传递任何东西,你只想给它你的函数名称,其余的将为你处理:

ClientValidationFunction="MyClientFunction" 

参考this page上的例子。

还要确保您使用了正确的大小写。应该是arguments.Valuearguments.IsValid

【讨论】:

  • 是的 @defaultuser 也是我在提示中告诉你的。
  • 谢谢@sbat....!有效。通过删除“();”,效果很好。只是想让自己清楚,如 MS 网页中所述,我们应该只将“字符串”(即确切的函数名称)传递给 ClientValidationFunction?另外,为什么 .Value 方法没有显示在参数的下拉列表中,但仍然可以调用?非常感谢!
  • 很高兴它有帮助。 :) 是的,只需给它您希望它调用的函数的确切名称,就像您指定 C# 中的事件处理程序一样。在这种情况下,JS 没有大量智能感知支持的原因是它是一种松散类型的语言,Visual Studio 无法推断调用该方法的上下文(换句话说,它不是那么聪明),因此它不知道这些参数的类型,因此也不知道它具有的功能/属性。不过,一些库(例如 jQuery)会专门为 VS 提供文档。
【解决方案2】:

你有几个问题。这是固定版本

<script>
    function MyClientFunction(sender, args) {
        var intValue = args.Value;
        alert(args.Value);
        if (intValue % 2 == 0) {
            args.IsValid = true;
        }
        else {
            args.IsValid = false;
        }
    }
</script>

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CustomValidator ID="CustomValidator1" runat="server" 
    ControlToValidate="TextBox1" ErrorMessage="Use Even Numbers" 
    ClientValidationFunction="MyClientFunction" EnableClientScript="true"></asp:CustomValidator>
<asp:Button ID="Button1" runat="server" Text="Button"></asp:Button>

变化的列表

  • 在验证器上添加ControlToValidate属性,将值设置为 您希望它验证的控件的 ID - TextBox1 在此 案例

  • ClientValidationFunction 的值应该只是一个名称 javascript 函数,而不是对它的实际调用

  • 该函数接受两个您认为正确的参数。我不能 找到参数属性的定义。第二 参数有Value(大写V),这是文本框输入 现在您已正确关联控件。

  • 在方法内设置IsValid真或假

  • 将错误消息移动到验证器属性而不是使用 提醒

此外,我将arguments 更改为args,因为前者是javascript 中的默认名称。

【讨论】:

  • 感谢您如此详细的解释,完全帮助我更清楚地理解代码。我选择@sbat的答案只是因为他之前回答了它,实际上你们都有正确的答案......由于我是新来的,不确定我是否应该根据回答时间选择答案.. :(
  • 别担心。通常你会选择能回答你问题的那个。如果其他答案对您有用,那就足够了。
【解决方案3】:

调用客户端函数时,您没有传递任何参数。
因此,它声明的两个参数都是undefined

当您在内联事件处理程序中调用 this 时,您可能希望将其作为参数传递。

【讨论】:

  • 这是问题之一,我不知道在调用它时要传递什么参数。现在我把它作为参数,它不再显示错误,而是显示文本框中输入的值(任何值)是“未定义”。
【解决方案4】:

原因是因为 JavaScript 是区分大小写的语言。 以下代码应该可以工作:

<script type="text/jscript" language="jscript">
    function MyClientFunction(sender, arguments) {
        var intValue = arguments.Value;
        alert(arguments.Value);
        if (intValue % 2 == 0) {
            arguments.IsValue = true;
        }
        else {
            alert("Use Even Numbers");
        }
    }
</script>

解释是 arguments 是一个参数对象,它具有您所知道的两个属性(Value 和 IsValid),并且您引用的是属性“Value”和小写“v”。

您还需要将属性 ControlToValidate 添加到您的 CustomValidator:

ControlToValidate="TextBox1"

CustomValidator 的公共 ClientValidationFunction 属性只需要对您的函数的有效全名引用,在您的情况下,您可以只使用“MyClientFunction”而不使用函数调用“();”。此外,所有 ASP.net 验证器都有一个名为 ValidationGroup 的公共属性,如果您有多个验证区域,它只是一个非常方便的标签。

【讨论】:

  • 我尝试改正为大写,但没有成功,仍然是同样的错误。 .Value 和 .IsValid 方法都没有以与参数“arguments”不同的颜色出现(就像这里显示的蓝色),它们只是像变量一样显示为相同的颜色......
  • 哦,你是对的,你还需要在你的验证器中添加 ControlToValidate="TextBox1"。
  • Javascript 不是强类型语言。
  • 他没有向函数传递任何东西。
  • @rob.alarcon Put ControlToValidate="TextBox1",仍然显示相同的错误。似乎没有方法 .Value 和 .IsValid,因为当我输入参数时。从下拉列表中,我找不到方法..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多