代码乱了(靳如坦的技术blog)

专注于.net,c#,Ajax、Sql Server、SmartClient等相关的开发
posts - 115, comments - 619, trackbacks - 13, articles - 2
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
早就听说Ajax技术了,传说中是一种很牛的东西,号称无刷新,其实是在web上通过javascript,使用异步的xmlhttp请求,实现无刷新的web界面。可惜一直没有体验过, 先后听做PHP的朋友用过PHP的Ajax开发包,而且做了很多很酷的东西,使小生羡慕不已。

      今天下了一个.net Ajax开发包,该开发包包括ASP2.0和目前ASP1.1版使用的Ajax,详细地址参见http://ajax.schwarz-interactive.de/,接下来,开工。

 1. 新建一个项目,在引用中添加引用Ajax.dll,Ajax.dll位于下载的压缩包里面。

 2.建立HttpHandler,在web.config里面加上


<configuration>
  
<system.web>
    
<httpHandlers>
    
<add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax" />
    
</httpHandlers>  
    
  
<system.web>
</configuration>

3.新建一个类DemoMethods,这个类实现获取客户端MAC地址:

using System;
using System.Web;

namespace AjaxSample
{
 
/// <summary>
 
/// Summary description for Methods.
 
/// </summary>

 public class DemoMethods
 
{
  
  [Ajax.AjaxMethod]
  
public string GetCustomerMac(string clientIP) //这里输入客户端IP,这个函数知识测试用,你也可以写一个其他的简单一点的函数代替
  
   
string mac = "";

   System.Diagnostics.Process process 
= new System.Diagnostics.Process();
   process.StartInfo.FileName 
= "nbtstat";
   process.StartInfo.Arguments 
= "-a "+clientIP;
   process.StartInfo.UseShellExecute 
= false;
   process.StartInfo.CreateNoWindow 
= true;
   process.StartInfo.RedirectStandardOutput 
= true;
 
   process.Start();
 
   
string output = process.StandardOutput.ReadToEnd();
   
int length = output.IndexOf("MAC Address = ");

   
if(length>0)
   
{
    mac 
= output.Substring(length+1417);
   }

 
   process.WaitForExit();
 
   
return mac.Replace("-""").Trim();
  }

 }


}
 

4.写javascript,新建一个名为default.js文件如下,
function GetMac()
{
 
var clientIP="192.168.0.1";
 //document.getElementById(
"Mac").value=DemoMethods.GetCustomerMac(clientIP).value
 alert(DemoMethods.GetCustomerMac(clientIP).value);
}

5.在某个Aspx页面放上一个html 的button

在页面上<head>中引用default.js :   <script language="javascript" src="default.js"></script>

在INPUT的onclick事件中加上onclick="javascript:GetMac()"

<INPUT style="Z-INDEX: 101; LEFT: 392px; POSITION: absolute; TOP: 176px" type="button"

    value="客户端获取IP" onclick="javascript:GetMac();">


6.在page页面的Page_Load事件中加上

private void Page_Load(object sender, System.EventArgs e)
 
{
   
// 在此处放置用户代码以初始化页面
   Ajax.Utility.RegisterTypeForAjax(typeof(AjaxSample.DemoMethods));
  }

注意:typeof(AjaxSample.DemoMethods)中,AjaxSample是命名空间,DemoMethods是要包含要调用方法的类,即上面第3步.新建类DemoMethods

(2007-6-23)文章修改:后面第7步部现在的版本不需要了,当时写这篇blog的时候是05年,现在变化已经很多了,推荐使用ajaxPro,
demo下载



7.修改Global.asax的Application_Start事件,设置Ajax的HandlerPath :

 

protected void Application_Start(Object sender, EventArgs e)
  {
     Ajax.Utility.HandlerPath 
= "ajax";
  }



 运行看看效果。是不是没有刷新就在服务器端取到客户端的MAC地址??

       需要注意的是:该版本的.net Ajax需要手工在中Global.asax加上Ajax.Utility.HandlerPath = "ajax"; 配置文件web.config必须加上HttpHandler的配置信息!

       该开发包的新版本还没有来得及体验,估计新版本中会方便一些,可能会去掉手动的设置Global.asax的Application_Start事件中加上Ajax.Utility.HandlerPath = "ajax";以及其他麻烦的设置!期待ing……


 

Feedback

#1楼   回复  引用  查看    

2005-09-19 13:12 by InterMa 的 Blog      
function GetMac()
{
var clientIP="192.168.0.1";
document.getElementById("Mac").value=DemoMethods.GetCustomerMac(clientIP).value
alert(DemoMethods.GetCustomerMac(clientIP).value);
}

里边的这一行:document.getElementById("Mac")
"Mac"是什么东西的标示?

#2楼   回复  引用  查看    

2005-09-19 13:15 by InterMa 的 Blog      
欧,大概懂了,应该是个label之类的冬冬。

#3楼   回复  引用  查看    

2005-09-19 14:27 by 拙劣的程序员      
不错不错

#4楼   回复  引用  查看    

2005-09-19 14:30 by 冰戈      
你这哪是取得客户端IP?明明是服务端的嘛,你测试了没?

#5楼   回复  引用  查看    

2005-09-19 14:36 by №阿儒№      
default.js中是如何定位客户端IP的,你这里用var clientIP="192.168.0.1";
能行吗?能在外网使用吗?

#6楼[楼主]   回复  引用  查看    

2005-09-19 14:49 by 代码乱了,不知道该怎么办!      
to interMac
是一个input或TextBox,id是Mac,这里我已经注释掉了,可以不用

#7楼[楼主]   回复  引用  查看    

2005-09-19 14:53 by 代码乱了,不知道该怎么办!      
to 冰戈
这个函数知识测试Ajax用,IP你可以输入你自己的IP试试,
你还可以写一个简单一点的函数
[Ajax.AjaxMethod]
public string GetServerTime()
{
return System.DateTime.Now.ToString();

}
在default.js里面加上一个方法:
function JSGetServerTime()
{
alert(NetAjax.WebForm1.GetServerTime().value);
}

在客户端调用JSGetServerTime就可以了,

#8楼   回复  引用  查看    

2005-09-19 15:11 by 風語者·疾風      
冰戈,这个怎么不是取得客户端的?他服务器端执行nbtstat -a XXX.XXX.XXX.XXX,而这个IP就是客户端的IP,所以取到的肯定是客户端的IP啊。再说这本来就只是一个例子而以,若要真是取客户端IP用这样来做嘛?

#9楼   回复  引用    

2005-09-19 15:25 by Magicloud[未注册用户]
和使用javascript调用webservice有什么不同……

#10楼[楼主]   回复  引用  查看    

2005-09-19 15:28 by 代码乱了,不知道该怎么办!      
基本原理是使用异步的xmlhttp请求。
当然也可以用javascript调用webservice来实现!

#11楼   回复  引用  查看    

2005-09-19 15:43 by 冰戈      
呵呵,不好意思,我测试的时候没注意修改clientIP
function GetMac()
{
var clientIP="192.168.0.1";
//document.getElementById("Mac").value=DemoMethods.GetCustomerMac(clientIP).value;
alert(DemoMethods.GetCustomerMac(clientIP).value);
}

所以感觉是错的,后来发现问题所在了,赶紧过来看看,就遭到 風語者·疾風 的质疑,呵呵,不好意思……

#12楼[楼主]   回复  引用  查看    

2005-09-19 16:49 by 代码乱了,不知道该怎么办!      
谢谢各位的支持!
如果有好的建议请提出,或者有好的Ajax方面的资料请和我联系!
jrt324@126.com

#13楼   回复  引用    

2005-09-20 11:44 by sunny[未注册用户]
我得到的结果是

undefined

是不是必须用.net 2.0?? 我是在1.1下做的测试

#14楼   回复  引用    

2005-09-20 11:47 by sunny[未注册用户]
终于成了! 原来我把 value 写成了 Value

一个字符之差!!

看来javascript还需多下功夫学学呢!

#15楼[楼主]   回复  引用  查看    

2005-09-20 13:07 by 代码乱了,不知道该怎么办!      
to sunny
可以了吗?

#16楼   回复  引用    

2005-09-20 13:33 by 存在所以孤独[未注册用户]
问:
如果我在后台需要处理页面上一些控件比如:textbox里的数据,你还得从javascript的函数里穿到后台吧
如果直接在后台得,是得不到的

#17楼[楼主]   回复  引用  查看    

2005-09-20 14:01 by 代码乱了,不知道该怎么办!      
to 存在所以孤独
当然可以得到的!当你在在服务器端取到textbox的值如
[Ajax.AjaxMethod]
public string GetTextBoxValue()
{
return Text1.text;

}
在default.js里面加上一个方法:
function JSGetText()
{
alert(NetAjax.WebForm1.GetTextBoxValue().value);

}

很简单!

#18楼   回复  引用    

2005-09-20 14:14 by 存在所以孤独[未注册用户]
to:代码乱了,不知道该怎么办!
呵呵,我想你误会的意思了.我的意思是这样:
比如,我一开始用的是有刷新的:
<asp:button id="AddButton" Runat="server" Text="添 加"></asp:button>
.cs里的方法是:
private void Add_Click(object sender, System.EventArgs e)
{
try
{
string name = this.Nametxt.value;
string age = this.Agetxt.value
Model.PerpleInfo Info = new PerpleInfo (name,age);
BLL.Perple.insert(Info );
}
catch(Exception ex)
{
.......
}

}
==============================================
但是用了你的方法,就得这样了:
[Ajax.AjaxMethod()]
public void Add(string name,string age)
{
string name = name;//用string name = this.Name.value行么??
string age = age
.........

}

是不是这样的?你在.cs里想用页面的数据,就得用传递到后台了,对不?

#19楼[楼主]   回复  引用  查看    

2005-09-20 14:27 by 代码乱了,不知道该怎么办!      
[Ajax.AjaxMethod()]
public void Add(string name,string age)
{
string name = name;//用string name = this.Name.value行么??-
//用string name = this.Name.value行么??-可以的
string age = age
.........

}

但是我还没有明白你的意思!你想实现什么?能再说清楚一点吗?

#20楼   回复  引用    

2005-09-20 14:36 by 存在所以孤独[未注册用户]
to:代码乱了,不知道该怎么办!
你有msn么:偶的是 zklvy@hotmail.com 在这个上和你说吧

我的意思是,你想执行一个插入操作,当然插入的数据来自页面
你直接用
public void Add()
{
string name = this.Name.value;
//这步不能得到数据name是null
//你自己测试一下就知道了
}

#21楼[楼主]   回复  引用  查看    

2005-09-20 14:53 by 代码乱了,不知道该怎么办!      
我最近都没有用MSN
我的MSN:jrt324@126.com
QQ:54433048

#22楼   回复  引用    

2005-10-18 18:34 by love_asp_net[未注册用户]
为什么最后没有值呢?
length=-1
请楼主再告知一下,谢谢了

#23楼   回复  引用    

2005-10-18 18:42 by love_asp_net[未注册用户]
楼主麻烦你解释一下,这几句话的意思!
process.StartInfo.FileName = "nbtstat";
process.StartInfo.Arguments = "-a "+clientIP;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
谢谢了!!!

#24楼   回复  引用  查看    

2006-04-12 11:14 by 太阳种子      
看不懂啊,楼主能不能加点注释,好方便我们这些入门者看。

#25楼   回复  引用    

2006-04-25 08:41 by xpc[未注册用户]
nbtstat 好像只能查一个子网里的

#26楼   回复  引用    

2006-05-29 16:59 by hrf_dotnet[未注册用户]
你的demo能运行吗?????????????????
按你的步骤做能成功吗——失败???????????

#27楼   回复  引用    

2007-01-29 13:33 by 兵[未注册用户]
document.getElementById("Mac").value=DemoMethods.GetCustomerMac(clientIP).value;
alert(DemoMethods.GetCustomerMac(clientIP).value);
是错误的代码啊 JS里怎么能调用CS里的代码呢
还请指教啊

#28楼   回复  引用    

2007-04-27 11:06 by 冰凝[未注册用户]
只能获取局域网里的啊,放到服务器就得到的值就为null了

#29楼[楼主]   回复  引用  查看    

2007-04-27 21:46 by 代码乱了      
@冰凝
是的,我只是作一个演示而已

#30楼   回复  引用  查看    

2007-05-08 21:48 by Lang_Hai      
没有连接成功就会返回空.

#31楼   回复  引用    

2007-06-17 02:05 by 莫[未注册用户]
DemoMethods 这个方法在js中调用时怎么识别不了呀,我都是按照你的做的咯!请指教!谢谢!

#32楼[楼主]   回复  引用  查看    

2007-06-17 15:01 by 代码乱了      
@莫

class DemoMethods这个类会被Ajax.net包装映射到客户端js,并把
[Ajax.AjaxMethod]
public string GetCustomerMac
{.....}
这个方法也包装映射到客户端js
调用的时候就是:类名.方法名(参数....)
这样调用

#33楼[楼主]   回复  引用  查看    

2007-06-17 15:01 by 代码乱了      
所以如果你的类名和不一样就要做相应的改动

#34楼   回复  引用    

2007-06-17 22:49 by 莫[未注册用户]
我的方法类名就是用的这个咯~而且其他的配置都和你说的一样,但是一点按狃就说DemoMethods 未定义,是不是用ajax技术要安装其他的什么东东,不光是导入这个ajax.dll文件。期待回答!

#35楼   回复  引用    

2007-06-17 22:50 by 莫[未注册用户]
要不要在aspx页面中导入ajax.dll这个东东,我是新手~不好意思 ~

#36楼[楼主]   回复  引用  查看    

2007-06-18 08:12 by 代码乱了      
@莫
ajax.dll这个要引用
还有配置文件,以及
在xxx.aspx.cs中page_load事件加入
Ajax.Utility.RegisterTypeForAjax(typeof(AjaxSample.DemoMethods));
这样的话应该是没有问题了

#37楼   回复  引用    

2007-06-18 19:06 by 莫[未注册用户]
晕了,这些我都加了的啊~

#38楼[楼主]   回复  引用  查看    

2007-06-19 23:58 by 代码乱了      
把你的demo发给我看看
jrt324@126.com

#39楼   回复  引用    

2007-06-21 19:27 by 莫[未注册用户]
好的 ,我给你发过去了,谢谢你咯~

#40楼[楼主]   回复  引用  查看    

2007-06-22 10:20 by 代码乱了      
你的demo有问题
应该在page_load事件中加入
Ajax.Utility.RegisterTypeForAjax(typeof(AjaxSample.DemoMethods));

你的demo中没有这个,只是放在一个根本没有执行的Button1_ServerClick事件中,这样的话客户端根本无法调用
我已经把改好的demo发 e-mail给你了

#41楼   回复  引用    

2007-09-14 13:17 by 随风之变量[未注册用户]
有点用哈
出售蓝奇高级验证码识别引擎,可准确识别新浪动网淘宝CSDN等多种复杂验证码。

输出为一个标准DLL,可供VB,VC,Delphi,C#.NET,VB.NET,模拟精灵,按键精灵等多平台调用,调用方法简单,几行代码即可完成。独具特色的边缘检测字符分离、旋转倾斜纠正和通用字符匹配算法(无论字体和大小), 使得该引擎对于像新浪、动网、淘宝、CSDN等多种验证码均有不错的识别率,是一款效果较为理想的验证码识别引擎。附详细的调用实例和代码注释等相关技术文档。

官方网站 - http://***/yzm_advocr
识别效果怎么样一试就知道 - DEMO下载 http://***/yzm_advocr/advocr.rar



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 239637




相关文章:

相关链接: