"sys.argumentexception 对于控件和行为 值不能为空"异常
<a id="ssA" runat="server" href='../default.aspx?ss=<%# Server.HtmlEncode(DataBinder.Eval
(Container.DataItem,"ss").ToString())%>' target="_blank"><%# Eval("ss")%></a>
HoverMenuExtender控件TargetControlID属性设为ssA。
结果出现"sys.argumentexception 对于控件和行为 值不能为空"异常!
刚开始,以为是AJAX控件的原因,因为.NET Framework中有一个ArgumentException异常类型。当调用一个方法,而传递给该方法的参数不能满足该方法对参数的要求时,产生该异常。.NET的ArgumentException异常具有一个只读属性ParamName,用以设定异常产生时导致异常的参数名。
ASP.NET AJAX 客户端框架扩展了JavaScript以使其支持一个与此类似的异常类型ArgumentException。该异常属于名称空间Sys。该JavaScript异常ArgumentException向外提供两个参数,分别为paramName和name。和所有的JavaScript异常的name属性一样,其name属性为一个字符串,该字符串唯一确定异常的类型。而paramName属性则等价于.NET Framework中ArgumentException类型异常的ParamName属性。
同样,ASP.NET AJAX客户端框架也扩展了JavaScript Error类型的功能以支持一个静态方法argument。该方法自动创建一个Sys.ArgumentException异常的实例,并将该实例返回给调用者。理解该函数功能的最好方法是看看它的内部实现:
Error.argument = function(a, c)
{
var b = "Sys.ArgumentException: " +
(c ? c : Sys.Res.argument);
if(a)
b += "/n" + String.format(Sys.Res.paramName, a);
var d = Error.create(b,
{ name : "Sys.ArgumentException",
paramName : a});
d.popStackFrame();
return d;
};
注意,argument 静态方法有两个参数,第一个参数为一个字符串,表示导致异常发生的参数名,第二个参数也是字符串,表示错误的消息。argument函数在内部调用已经在第2章中讨论过的create静态方法:
var d = Error.create(b,
{ name : "Sys.ArgumentException",
paramName : a});
create静态方法将一个JavaScript对象作为它的第二个参数。该对象提供了被创建的Error对象的额外信息。注意,argument方法传递了一个字面对象(object literal)作为create方法的第二个参数。该对象设定唯一确定该异常的字符串,以及导致异常的参数名。
Sys.ArgumentException 并没有构造函数,因此不能使用new运算符来对其进行实例化。相反,必须使用JavaScript Error对象的静态函数argument来实例化该异常的实例。
在下面的代码中,当传递给validateInput的参数不能满足正则表达式的要求时,validateInput函数将产生一个Sys.ArgumentException异常。而clickCallback函数将在它的catch块中获取该异常,并将异常对象的message属性的值显示出来。
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Untitled Page</title>
<script language="javascript" type="text/javascript">
function validateInput(input)
{
var reg = new RegExp("(//d//d)[-/](//d//d)[-/](//d//d(?://d//d)?)");
var date = reg.exec(input);
if (date == null)
{
var err = Error.argument("input", "Invalid date!");
throw err;
}
}
function clickCallback()
{
var date = document.getElementById("date");
try
{
validateInput(date.value);
}
catch (e)
{
alert(e.message);
date.value="";
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager runat="server"
ID="ScriptManager1" />
Enter date: <input type="text" id="date" />
<input type="button" value="Validate"
οnclick="clickCallback()" />
</form>
</body>
</html>
难道是TargetControlID属性指向的是设定为服务器端控件的A导致此异常的?于是便通过服务器端编程设定TargetControlID属性。结果还是如此。
于是又想异常指的是控件和行为 值不能为空。感觉可能是A的Href属性编码有问题。试了一下,把绑定前面的一段路径字符串去掉,再看此异常不见了。于是通过服务器端编程,在ItemDataBound事件中对A的Href属性赋值。
HtmlAnchor ssA = e.Item.FindControl("ssA ") as HtmlAnchor;
ssA .Attributes.Add("href", "../default.aspx?ss=" + Server.HtmlEncode(ssA .Name));
问题解决。
但是还是很困惑......
希望有朋友知道此问题的原因,请一定告诉我啊!