Javascript 直接調(diào)用服務(wù)器C#代碼 ASP.NET Ajax實(shí)例
在MS Ajax中,JS與C#交互的一種方式就是調(diào)用WebService,該WebService可以ASMX的也可以是WCF的,不論哪種方式,系統(tǒng)都會(huì)自動(dòng)為開發(fā)者生成代理的JS類。實(shí)現(xiàn)方法如下:
1. 建立一個(gè)網(wǎng)站,并在其中添加一個(gè)WCF服務(wù)(這里一定要選擇Ajax-Enabled WCF Service),如下圖所示:

2. IDE會(huì)自動(dòng)為我們生成一個(gè)SVC文件,是對(duì)外的接口,以及該SVC對(duì)應(yīng)的后臺(tái)實(shí)現(xiàn)類,該類文件會(huì)被放在App_Code下,如下圖所示:
3.修改該類的代碼,如下所示:
[ServiceContract(Namespace = "TestAjax")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service
{
[OperationContract]
public bool ValidateUser(string uid, string pwd)
{
if (uid=="sa"&&pwd=="sa")
{
return true;
}
return false;
}
}
4.現(xiàn)在我們就可以頁(yè)面里調(diào)用了,首先在頁(yè)面中添加一個(gè)ScriptManager,并引入我們剛才編寫的那個(gè)WCF WebService(目的是在運(yùn)行的時(shí)候生成JS的代理類),如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!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 runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="~/Service.svc"/>
</Services>
</asp:ScriptManager>
</div>
</form>
</body>
</html>
5.接下來可以編寫JS代碼來直接調(diào)用C#寫的WebService了。JS代碼如下所示:
<script type="text/javascript">
function ValidateUser(uid, pwd) {
TestAjax.Service.ValidateUser(uid,pwd,OnSucceed ,OnFailed );
}
function OnSucceed(result) {
if (result == true) {
window.alert("通過驗(yàn)證");
}
else {
window.alert("驗(yàn)證失?。?);
}
}
function OnFailed(result) {
window.alert("操作失?。?+result ._message);
}
</script>
6.這里請(qǐng)大家注意,在調(diào)用TestAjax.Service.ValidateUser方法時(shí),代碼中并沒有直接取該函數(shù)的返回值,因?yàn)槔眠@種方案對(duì)服務(wù)器函數(shù)的調(diào)用都是異步的,正確的處理方法是指定了兩個(gè)回調(diào)函數(shù)OnSucceed和OnFailed,第一個(gè)函數(shù)是成功時(shí)的回調(diào),后一個(gè)是失敗時(shí)的回調(diào),這兩個(gè)函數(shù)都需要一個(gè)參數(shù),OnSucceed的參數(shù)就是服務(wù)器函數(shù)的返回值,而OnFailed的參數(shù)是失敗時(shí)的出錯(cuò)信息,功能有點(diǎn)像Exception類型,其中_message屬性中出錯(cuò)信息,_stackTrace中出錯(cuò)的堆棧跟蹤信息。
7.千萬別說這種回調(diào)方法麻煩!其實(shí)這是一種常規(guī)的異步回調(diào)模式,大多數(shù)情況(不論什么語言)都會(huì)這么寫的!
8.頁(yè)面上完整的代碼如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!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 runat="server">
<title></title>
<script type="text/javascript">
function ValidateUser(uid, pwd) {
TestAjax.Service.ValidateUser(uid,pwd,OnSucceed ,OnFailed );
}
function OnSucceed(result) {
if (result == true) {
window.alert("通過驗(yàn)證");
}
else {
window.alert("驗(yàn)證失敗!");
}
}
function OnFailed(result) {
window.alert("操作失敗:"+result ._message);
}
function Button1_onclick() {
var uid = $get("tbxUid").value;
var pwd = $get("tbxPwd").value;
ValidateUser(uid,pwd);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="~/Service.svc"/>
</Services>
</asp:ScriptManager>
</div>
用戶名:<input id="tbxUid" type="text" /><br />
密碼: <input id="tbxPwd" type="text" />
<input id="Button1" type="button" value="驗(yàn)證" onclick="return Button1_onclick()" />
</form>
</body>
</html>
9.運(yùn)行結(jié)果如下所示:
當(dāng)用戶名和密碼都是sa時(shí)會(huì)通過驗(yàn)證
當(dāng)用戶名和官友有一個(gè)值不是sa時(shí)就不能通過驗(yàn)證


10. 大家有什么問題給我發(fā)Email吧:warensoft@foxmail.com
相關(guān)文章
Excel自定義關(guān)閉按鈕實(shí)現(xiàn)代碼
這篇文章主要介紹了Excel自定義關(guān)閉按鈕實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
.NET使用YARP通過編碼方式配置域名轉(zhuǎn)發(fā)實(shí)現(xiàn)反向代理
這篇文章介紹了.NET使用YARP通過編碼方式配置域名轉(zhuǎn)發(fā)實(shí)現(xiàn)反向代理的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
.NET Core 3.0 可回收程序集加載上下文的實(shí)現(xiàn)
這篇文章主要介紹了.NET Core 3.0 可回收程序集加載上下文的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
httpHandler實(shí)現(xiàn).Net無后綴名Web訪問的實(shí)現(xiàn)解析
有時(shí)候我們看到很多網(wǎng)站是網(wǎng)址是沒有后綴名的,其實(shí).net中可以通過httpHandler來實(shí)現(xiàn)。2011-10-10
解協(xié)議時(shí)有符號(hào)和無符號(hào)整數(shù)型處理
這篇文章主要介紹了解協(xié)議時(shí)有符號(hào)和無符號(hào)整數(shù)型處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
Visual studio 2017添加引用時(shí)報(bào)錯(cuò)未能正確加載ReferenceManagerPackage包的解決方法
這篇文章主要介紹了VS2017添加引用時(shí)報(bào)錯(cuò)未能正確加載ReferenceManagerPackage包的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
asp.net表單提交時(shí)防重復(fù)提交并執(zhí)行前臺(tái)的JS驗(yàn)證
今天遇到這樣的一個(gè)情況,就是用戶重復(fù)提交。當(dāng)然這個(gè)不能怪用戶,只能怪.NET或者服務(wù)器反應(yīng)遲鈍,下面有個(gè)不錯(cuò)的教程,大家可以參考下2013-10-10
asp.net ext treepanel 動(dòng)態(tài)加載XML的實(shí)現(xiàn)方法
當(dāng)你在asp.net下面 使用Ext TreePanel直接加載服務(wù)器上XML文件會(huì)出現(xiàn)樹不能顯示,樹據(jù)不能正確加載的問題。2008-10-10

