『壹』 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("我來搞破壞!");
}
}
這里我們手工拋出了一個異常。下面運行程序,會得到如下結果:
如上圖,當出現異常時,不僅自動調用了異常處理回調函數,還很方便地取得了錯誤信息。