我遇到了一个问题,我猜测它是由Javascript作用域问题和Microsoft Asp.Net客户端框架一起引起的。
由于这个问题所述的原因,我需要覆盖由Asp.Net的ScriptResource.axd提供的ValidatorConvert Javascript函数,并由其Validator服务器控件使用。
首先我会介绍如何使代码工作。然后我会展示一个我不能让它工作的场景。
这是一个简单的Asp.Net WebForm,其中包含一个验证控件:
现在,当asp.net渲染表单时,它会以某种方式检测到页面上有一个可见的验证控件。因此,在我的脚本标签正下方和表单正上方,将调用客户端JS进行验证器。这个JS文件将有一个ValidatorConvert函数,它将被我的函数覆盖。
现在,这里有一个场景,这种方法不起作用。下面是一个稍微不同的WebForm:
现在我有一个UpdatePanel里面包含一个MultiView。页面加载时,可见的视图是只有一个按钮的第一个视图。当按下此按钮时,它将显示具有验证控件的第二个视图。由于这是在UpdatePanel内部,因此将使用AJAX完成此操作。
现在,在呈现表单时,默认情况下不会显示验证控件。因此,链接到javascript文件(ScriptResource.axd)将根本不会放置在页面上!
但是当按下按钮并且验证程序可见时,链接将被动态添加。
问题是,此链接由asp.net框架放置在head标记中。
即使我的函数仍然在原始函数的层次结构下定义,我的函数也没有被调用。
我尝试将我的函数放置在不同的位置,包括head标记,但似乎也不起作用。似乎最后定义的函数被视为有效。
那么,在第二种情况下,如何覆盖函数?此外,是否有适用于两种情况的单个解决方案?
感谢您提前花费时间。
由于这个问题所述的原因,我需要覆盖由Asp.Net的ScriptResource.axd提供的ValidatorConvert Javascript函数,并由其Validator服务器控件使用。
首先我会介绍如何使代码工作。然后我会展示一个我不能让它工作的场景。
这是一个简单的Asp.Net WebForm,其中包含一个验证控件:
<body>
<form id="form1" runat="server">
<script type="text/javascript">
function ValidatorConvert(op, dataType, val) {
//>>Overwrite ValidatorConvert function.
//>>Call to the original JS file will be below the form tag and above script tag
return op.toString(); //<<Consider everything as valid (client side)
}
</script>
<asp:ScriptManager runat="server"
ID="Scriptmanager1"
allowcustomerrorsredirect="true"
asyncpostbackerrormessage="Operation cannot be executed."
asyncpostbacktimeout="90"
enablepartialrendering="true"
enablescriptglobalization="true"
enablescriptlocalization="true"
supportspartialrendering="true"
scriptmode="Inherit"></asp:ScriptManager>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CompareValidator
ID="CompareValidator1"
runat="server"
ErrorMessage="Ops, not an integer"
Operator="DataTypeCheck"
Type="Integer"
ControlToValidate="TextBox1"></asp:CompareValidator>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</form>
</body>
现在,当asp.net渲染表单时,它会以某种方式检测到页面上有一个可见的验证控件。因此,在我的脚本标签正下方和表单正上方,将调用客户端JS进行验证器。这个JS文件将有一个ValidatorConvert函数,它将被我的函数覆盖。
现在,这里有一个场景,这种方法不起作用。下面是一个稍微不同的WebForm:
<body>
<form id="form1" runat="server">
<asp:ScriptManager runat="server"
ID="Scriptmanager1"
allowcustomerrorsredirect="true"
asyncpostbackerrormessage="Operation cannot be executed."
asyncpostbacktimeout="90"
enablepartialrendering="true"
enablescriptglobalization="true"
enablescriptlocalization="true"
supportspartialrendering="true"
scriptmode="Inherit"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0">
<asp:View ID="View1" runat="server">
<asp:Button ID="ButtonShowInput" runat="server" Text="Show Input Field" CausesValidation="false" OnClick="ButtonShowInput_Click" />
</asp:View>
<asp:View ID="View2" runat="server">
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CompareValidator
ID="CompareValidator1"
runat="server"
ErrorMessage="Ops, not an integer"
Operator="DataTypeCheck"
Type="Integer"
ControlToValidate="TextBox1"></asp:CompareValidator>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</asp:View>
</asp:MultiView>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
现在我有一个UpdatePanel里面包含一个MultiView。页面加载时,可见的视图是只有一个按钮的第一个视图。当按下此按钮时,它将显示具有验证控件的第二个视图。由于这是在UpdatePanel内部,因此将使用AJAX完成此操作。
现在,在呈现表单时,默认情况下不会显示验证控件。因此,链接到javascript文件(ScriptResource.axd)将根本不会放置在页面上!
但是当按下按钮并且验证程序可见时,链接将被动态添加。
问题是,此链接由asp.net框架放置在head标记中。
即使我的函数仍然在原始函数的层次结构下定义,我的函数也没有被调用。
我尝试将我的函数放置在不同的位置,包括head标记,但似乎也不起作用。似乎最后定义的函数被视为有效。
那么,在第二种情况下,如何覆盖函数?此外,是否有适用于两种情况的单个解决方案?
感谢您提前花费时间。
ScriptManager.RegisterStartupScript
或ScriptManager.RegisterClientScriptBlock
在按钮点击时以编程方式生成JS函数吗? - Yuriy Galanter