Asp.net Ajax javascript不能写在js文件中

freeflying1222 2009-10-02 11:11:16
如题。
同样的代码,我在aspx页面中就是能执行的;
放在js文件中,通过引用使用就不行了,为什么?

我猜是ScriptManager的原因;
能在js文件中引入ScriptManager么?
...全文
175 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyuhan19890812 2010-04-01
  • 打赏
  • 举报
回复
顶.也遇到此类问题
namhyuk 2009-10-03
  • 打赏
  • 举报
回复
或者你可以不用<ScriptManagerProxy>
在用户控件的Page_Load里动态加载.js

//MyUserControl.ascx
protected void Page_Load(object sender, EventArgs e)
{
ScriptManager.RegisterClientScriptInclude(this, GetType(), "ShowMessageScript", ResolveClientUrl("~/Scripts/JScript.js"));
}


废话很多,总结一下:
1、.js代码里不要出现<%= Xxx.Client %>等这样需要asp.net引擎解析的东西。
2、用户控件里的<script type="text/javascript">或<script scr="xxx.js">段里的东西在UpdatePanel的异步刷新过程中是不会传递到客户端的。所以这样的代码要在用户控件里通过ScriptManagerProxy加载,或通过ScriptManager.RegisterClientScriptInclude, ScriptManger.RegisterClientScriptInclude等加载。
3、在asp.net ajax时引用的.js文件的末尾一定要加上:
if (Sys && Sys.Application) { Sys.Application.notifyScriptLoaded(); }
namhyuk 2009-10-03
  • 打赏
  • 举报
回复
去掉Default.aspx.cs里的动态注册代码,在.aspx里

<script type="text/javascript">
function showMessage() {
var s = document.getElementById('<%= TextBox1.ClientID %>').value;
alert(s);
}
</script>
<asp:TextBox runat="server" ID="TextBox1" />
<input type="button" value="弹出消息框" onclick="showMessage();" />

这样就没问题了。 也就是说<%= Xxx.ClientID %>这样的东西放进.js里是不OK的。
ajax上也一个道理 $get('<%= XXX.ClientID %>')这样的不要让它出现在.js里。

2. 还有一种情况值得注意。
比如用户控件MyUserControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MyUserControl.ascx.cs" Inherits="MyUserControl" %>
<script type="text/javascript">
function showMessage(s) {
alert(s);
}
</script>

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<input type="button" value="用户控件内的按钮" onclick="showMessage($get('<%= TextBox1.ClientID %>').value);" />

把它直接拖到.aspx页面内的UpdatePanel内,用户控件工作正常。
.aspx

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<uc1:MyUserControl ID="MyUserControl1" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>


但如果在UpdatePanel内通过Button实现无刷新加载呢?
.aspx

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Button ID="ButtonLoadUserControl" runat="server" Text="动态加载用户控件"
onclick="ButtonLoadUserControl_Click" />
</ContentTemplate>
</asp:UpdatePanel>

.aspx.cs

protected void ButtonLoadUserControl_Click(object sender, EventArgs e)
{
if (UpdatePanel1.ContentTemplateContainer.FindControl("UserControlID") == null)
{
Control c = Page.LoadControl("MyUserControl.ascx");
c.ID = "UserControlID";
UpdatePanel1.ContentTemplateContainer.Controls.Add(c);
}
}

这时就会发现动态载入到UpdatePanel内的用户控件不工作了。
这时的解决办法就是在用户控件里加上<ScriptManagerProxy />

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MyUserControl.ascx.cs" Inherits="MyUserControl" %>
<%--MyUserControl.ascx--%>
<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
<Scripts>
<asp:ScriptReference Path="~/Scripts/JScript.js" />
</Scripts>
</asp:ScriptManagerProxy>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<input type="button" value="用户控件内的" onclick="showMessage($get('<%= TextBox1.ClientID %>').value);" />

JScript.js

function showMessage(s) {
alert(s);
}
if (Sys && Sys.Application) { Sys.Application.notifyScriptLoaded(); }

最后一行:if (Sys && Sys.Application) { Sys.Application.notifyScriptLoaded(); }必须加,加与不与自己试一下就知道了。
namhyuk 2009-10-03
  • 打赏
  • 举报
回复
废话多些吧, 暂不考虑ajax.

1、你不能在.js里用document.getElementById('<%= TextBox1.ClientID %>');这样的东西。


//Scripts/JScript.js
function showMessage(s) {
alert(s); //简单接收一字符串, 用alert()显示。
}


// Default.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{ // 其实没必要动态注册,这里只是故意用一下动态注册。
if (!Page.ClientScript.IsClientScriptIncludeRegistered(this.GetType(), "myMessage"))
{
Page.ClientScript.RegisterClientScriptInclude(this.GetType(), "myMessage", ResolveClientUrl("~/Scripts/JScript.js"));
}
}

这段代码在客户端生成:color=#0000FF]:<script src="Scripts/JScript.js" type="text/javascript"></script>[/color]

<%--Default.aspx--%>
<asp:TextBox runat="server" ID="TextBox1" />
<input type="button" value="弹出消息框" onclick="showMessage(document.getElementById('<%= TextBox1.ClientID %>').value);" />


也就是把TextBox输入的文字传给showMessage()方法。这样没问题。

但如果:.aspx
<input type="button" value="弹出消息框" onclick="showMessage();" />
.js改成
function showMessage() {
var s = document.getElementById('<%= TextBox1.ClientID %>').value; alert(s);
}
这样就不行了。asp.net引擎没有义务为你解析的.js方法里的'<%= TextBox1.Client %>'。

  • 打赏
  • 举报
回复
[Quote=引用楼主 freeflying1222 的回复:]
如题。
同样的代码,我在aspx页面中就是能执行的;
放在js文件中,通过引用使用就不行了,为什么?

我猜是ScriptManager的原因;
能在js文件中引入ScriptManager么?
[/Quote]

实在不懂你问什么?

放在aspx页面中的东西就应该放在js文件中可以运行?不懂。

在js文件中引入ScriptManager?更不懂怎么会这么比微软还超前许多年?
wangan2008 2009-10-02
  • 打赏
  • 举报
回复
把导入代码移到aspx执行效果代码后面试试
wangan2008 2009-10-02
  • 打赏
  • 举报
回复
up

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧