『壹』 aspnet_client 的作用以及存储位置
在虚拟主机的 wwwroot 目录下您会发现有一个名为 aspnet_client 的文件夹,该文件夹中含有集成了 ASP.NET 的“SmartNavigation”功能的 javascript。如果启用 SmartNavigation,网页设计人员就可以在页面以及其他内容之间保持滚动条和元素焦点的位置。
目录 aspnet_client 是虚拟根 Web 应用程序目录,该目录是当您安装 .NET Framework SDK 或 Visual Studio .NET 时在您的计算机上创建的。此文件不占用户空间,请用户在使用网站空间的时候不要删除该文件夹。
例如,随 ASP.NET 附带的脚本文件位于以下位置。
d:\home\ftp用户名/wwwroot/aspnet_client/system_web/<版本编号>/文件
如果安装有 SDK 的多个版本,您将在 aspnet_client/system_web 下看到多个子目录。因为控件库与脚本文件的特定版本相关联,所以部署模式允许控件库的不同版本并行运行。 出现了“aspnet_client”这个文件夹,是干什么的?
这个是文件的路径下还有文件!下面的完整路径:
aspnet_client\system_web\1_1_4322
里面还有三个文件:SmartNav.htm,smartnav.js,webuivalidation.js!
作用是:安装了.net框架之后,就会在网站目录下出现这样的文件夹.用以支持.net环境.1_1_4322表示你的.net framework 的版本为 1.1.4322,里面的3个文件用于为.net验证控件提供脚本支持服务器里面装了.net后,会在服务器上每个网站的目录里面增加这个文件夹的 在生成虚拟站点的时候会自动在根下生成一个名字为aspnet_client的文件夹,你看看是不是这个文件夹没有了?
解决办法重新建一个独立站点,把生成的aspnet_client文件夹复制到这个站点的跟下。
首先确定你安装了iis
然后从命令行进入文件夹C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\
盘符,系统文件夹,版本号可能不一样,看你自己的机子,版本号选择最高的那个文件夹
运行命令aspnet_regiis.exe -i
安装完毕即可使用vs打开
一点资料:
aspnet_regiis命令详解.
用法:
aspnet_regiis.exe[-i[r][-enable]|-u[a]|-r|-s[n]|-k[n]|-lv|-lk|-c|-e[a]|-?]
-i-安装ASP.NET的此版本,并更新IIS元数据库根处的
脚本映射和根以下的所有
脚本映射。现有的低版本脚本映射
升级到此版本。
-ir-安装ASP.NET的此版本,仅注册。不
更新IIS中的脚本映射。
-enable-带-i或-ir指定-enable时,还将
在IIS安全控制台(IIS6.0或更高版本)中启用ASP.NET。
-s-在指定的路径以递归方式安装此版本
的脚本映射。现有的低版本脚本映射
升级到此版本。
例如aspnet_regiis.exe-sW3SVC/1/ROOT/SampleApp1
-sn-在指定的路径以非递归方式安装此版本的
脚本映射。现有的低版本脚本映射
升级到此版本。
-r-为IIS元数据库根位置的此版本
以及根以下的所有脚本映射安装脚本映射。不论当前版本是什么,
所有现有的脚本映射都
更改为此版本。
-u-卸载ASP.NET的此版本。到此版本的
现有脚本映射重新映射到此计算机上安装的
其余的最高ASP.NET版本。
-ua-卸载计算机上的所有ASP.NET版本
-k-从指定的路径中以递归方式移除到任何ASP.NET版本的所有
脚本映射。
例如aspnet_regiis.exe-kW3SVC/1/ROOT/SampleApp1
-kn-从指定的路径中以非递归方式移除到任何ASP.NET版本的所有
脚本映射。
-lv-列出计算机上安装的所有
ASP.NET版本(包括状态和安装路径)。
Status:Valid[(Root)]|Invalid
-lk-列出包含ASP.NET脚本映射的所有IIS元数据库项的所有路径
(连同版本一起)。不显示从父项
继承ASP.NET脚本映射的项。
-c-将客户端脚本的此版本安装到
每个IIS站点目录的aspnet_client子目录中。
-e-从每个IIS站点目录的
aspnet_client子目录中
移除客户端脚本的此版本。
-ea-从每个IIS站点目录的aspnet_client子目录中
移除客户端脚本的所有版本。
-?-打印此帮助文本。
example:
当系统新建一个asp.netweb应用程序的时候,提示错误信息如下:
"VisualStudio.NET已检测到指定的Web服务器运行的不是ASP.NET版本,你将无法运行ASP.NET应用程序或服务。"
可以尝试运行
aspnet_regiis-i
aspnet_regiis-r
两个命令来安装asp.net服务管理器.
如果还是不行的话,再尝试一下下面的操作:
1、先确定是不是1.1
2、把"IP地址"设成全部未分配
3、在IE连接设置中把本地地址不使用代理服务器那里打上勾
『贰』 我网站里自己出现了“aspnet_client”这个文件夹,是干什么的
安装了.net框架之后,就会在网站目录下出现这样的文件夹.用以支持专.net环境.1_1_4322表示你的属.net framework 的版本为 1.1.4322,里面的3个文件用于为.net验证控件提供脚本支持
『叁』 怎样去掉<div class="aspNetHidden"></div>中的内容
jquery这样写: $(".aspNetHidden").text("");
js这样写:document.getElementById("aspNetHidden").innerHTML,不过这个要把class改成id
『肆』 在ASP.net中用Ajax实现客户端控件调用后台代码,应该怎么实现
如何在客户端直接调用WebService中的方法?
1.Web.config中需要配置好运行ASP.NET AJAX框架相应的配置项,当然,建立一个ASP.NET AJAX Enabled Web Site项目时,Web.config已经配置好了。
2.想让某个WebService可以被JS调用,需要做一下几步:
I.在这个WebService文件里用“using System.Web.Script.Services;”引入这个命名空间。
II.在这个类的上面添加“[ScriptService]”属性。
III.在需要被调用的方法上添加“[WebMethod]”属性。
具体例子可以参考《ASP.NET AJAX客户端编程之旅(一)——Hello!ASP.NET AJAX》中的SayHelloService.cs的代码。
3.调用WebService的客户端页面也要做相应准备。首先就是页面中要有一个ScriptManager控件,然后需要在其中指明WebService文件的位置。如:
<Services>
<asp:ServiceReference Path="~/SayHelloService.asmx" />
</Services>
将这段代码放在<asp:ScriptManager>和<asp:ScriptManager />标签之间,就可以使得这个页面中的JS可以直接调用SayHelloService.asmx中的方法。具体代码可以参考《ASP.NET AJAX客户端编程之旅(一)——Hello!ASP.NET AJAX》中第二个例子中的Default.aspx的代码。
做好以上三项准备,这个页面中的JS代码就可以使用我们熟悉的“类名.方法名”的方法直接调用WebService中的方法了。
魔法背后的故事
我们知道,虽然我们一直说是“直接调用”,但这是指在语法层面上“直接调用”。而实际上,JavaScript代码是不可能真正直接调用后台程序的,这中间一定使用了XMLHttpRequest对象。那么,到底是谁给我们实施了“障眼法”?答案就在下面这张图上:
上图就是这个所谓“直接调用”真正的秘密。如图,现在假设有个WebService类,名为Class1,有两个方法:Method1和Method2。当这个WebService被我们用上面提到的方法处理过后,ASP.NET AJAX框架就会自动分析这个类,并且在客户端生成一个这个类的客户端代理(Proxy),这个代理类是一个JavaScript对象,其类名、方法名都和后台类一致。而当我们从客户端的JS脚本调用时,实际上调用的是这个代理类,而代理类则使用XMLHttpRequest对象,通过传统的Ajax方式,调用后台类。这样,我们就感觉好像在前台直接调用后台类似的。
可是……哪里似乎还是不一样……
通过上面的分析,我们知道,ASP.NET AJAX调用后台方法,说到底还是使用的XMLHttpRequest对象,这样传统Ajax的限制,就使得我们不可能真的像在后台调用方法一样方便。
例如,我们在后台都是用“变量=类名.方法名”或者“变量=对象名.方法名”的方式调用,这样变量就直接获取了这个方法的返回值,但是Ajax不行,它必须通过回调函数获取返回值,这一点也体现在了ASP.NET AJAX的使用方法上。看上一篇文章的例子就知道,即使使用了ASP.NET AJAX框架,仍然还是需要用回调函数的,只不过是语法上简化了。
下面,正式给出调用后台类的语法:
类名.方法名(参数1,参数2,……,参数n,回调函数)
也就是说,调用上有两个差别:一是不需要使用变量接收返回值,二是要在所有参数后面加一个参数:回调函数。例如,有个类的方法,在后台调用是:
var1 = Class1.Method1(Para1,Para2);
换到前台JS调用时,就是如下的样子:
Class1.Method1(Para1,Para2,CallBackFunction);
那么,返回值到哪里去取呢?答案是到回调函数中,回调函数的原型是:回调函数名(返回值)。当然,存储返回值变量的名字是开发人员随意取的,然后就可以在回调函数中使用这个返回值变量了。例如,接着上面程序,写一个函数:
function CallBackFunction(result){}
则在这个函数中,result就含有Class1.Method1(Para1,Para2,CallBackFunction);的返回值。
为什么不直接调用类中的方法,而非要经过WebService呢?
上文我曾经说过,ASP.NET AJAX允许我们直接调用后台类中的方法,但是我们不提倡这样做,而是提倡经过WebService的过渡。其原因有如下几点:
1.要使得某个类可以被JS调用,也需要在其中做一些修改,如增加一些属性(Attribute)等,这会对这些类造成一种“污染”。
2.我们知道了,使用ASP.NET AJAX框架也需要从回调函数中获取返回值,而不是直接获取。考虑以下情况:如果某段JS需要调用三个后台方法完成一个操作,那么,就需要写三个回调函数。即要经过“调用第一个方法-第一个回调函数中调用第二个方法-第二个回调函数中调用第三个方法-第三个回调函数中取得返回值”。
这个过程很麻烦。而使用WebService后,我们可以将这个三个方法封装到一个WebService方法里,因为WebService是支持“变量=类名.方法名”这种传统的调用方法的。这样经过WebService过渡,JS中只要一个回调函数就可以了。
3.从本身特性上看,WebService比普通类更适合作为Ajax的后台方法。
处理异常
一般来说,有成功就有失败,异步调用也是一样,会出现请求异常的情况。在传统的Ajax中,不论请求成功还是失败,回调函数都会被调用,然后我们可以判断 XMLHttpRequest对象的状态确定请求是否成功,如果失败了,可以进行异常处理。
但是,在ASP.NET AJAX应用中,只有成功时回调函数才会被调用,那么失败时怎么办?其实,ASP.NET AJAX允许我们在调用后台方法时指定两个回调函数,语法如下:
类名.方法名(参数1,参数2,……,参数n,请求成功时的回调函数,请求失败时的回调函数)
只不过在前面的应用中,我们省略了第二个回调函数。为了理解这个地方,我们做一个小实验,打开上一篇中的ASPNETAJAXTest这个程序,将ajax.js这个文件里的内容做如下修改:
ajax.js:
1//单击btnSayHello时调用的JS函数
2function btnSayHello_onClick()
3{
4 SayHelloService.SayHello(OnSucceeded,OnFailded);
5}
6
7//成功时的回调函数
8function OnSucceeded(reusltText)
9{
10 get("result").innerHTML=reusltText;
11}
12
13//失败时的回掉函数
14function OnFailded(error)
15{
16 get("result").innerHTML="调用失败。错误信息:"+error.get_message();
17}
其中异常时的回调函数有一个参数error,它是一个ASP.NET AJAX框架定义的一个对象,包含了异常信息。其中get_message()方法将返回异常信息字符串。
为了看效果,我们还要到WebService里搞一点破坏,让请求出现异常,“破坏”后的WebService如下:
SayHelloService.cs:
using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class SayHelloService : System.Web.Services.WebService
{
public SayHelloService() { }
[WebMethod]
public string SayHello()
{
//Hello myHello = new Hello();
//return myHello.SayHello();
throw new Exception("我来搞破坏!");
}
}
这里我们手工抛出了一个异常。下面运行程序,会得到如下结果:
如上图,当出现异常时,不仅自动调用了异常处理回调函数,还很方便地取得了错误信息。