Ajax研究小结

Ajax最近可谓是流行加火热,为web开发中的刷新问题带来了新的生机与希望。虽然这项技术在很久以前就有人在用,无非是XMLHttpRequest JavaScript的几项技术按一定的方式组合,也算不得什么新技术,但挂了一个名,做了一个封装,还是为不少开发人员提供了很多便捷。因此,我也抽出时间来研究了一下,并且应用到当前的项目里,同时做个小结放在这里。

 

 

 

 

 

 

具体使用:

 

 

 

1. 在项目中添加引用Ajax.dll (我用的版本是 5.7.22.2

 

 

 

2. 修改web.config,在里面增加

 

 

 

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

 

 

 

 

 

 

3. 新建一个实现业务逻辑的类,并在里面增加方法,在方法上面加上[Ajax.AjaxMethod()]。如:

 

 

 

    /// <summary>

 

 

 

     /// 业务逻辑的类

 

 

 

     /// </summary>

 

 

 

     public class AjaxBLLClass

 

 

 

     {

 

 

 

         public AjaxBLLClass()

 

 

 

         {            

 

 

 

         }

 

 

 

         [Ajax.AjaxMethod()]

 

 

 

         public string GetPlaceList(int ClassID)

 

 

 

         {

 

 

 

              Advertisement.BLL.ADManage.AdPlace adplace=new Advertisement.BLL.ADManage.AdPlace();

 

 

 

              DataSet ds=adplace.GetListByClass(ClassID);

 

 

 

              string str="";

 

 

 

              for(int m=0;m<ds.Tables[0].Rows.Count;m++)

 

 

 

              {

 

 

 

                   str+=","+ds.Tables[0].Rows[m]["PlaceID"].ToString()+"|"+ds.Tables[0].Rows[m]["PlaceName"].ToString();

 

 

 

              }

 

 

 

str=str.Substring(1,str.Length-1);

 

 

 

return str;

 

 

 

         }

 

 

 

        

 

 

 

4. 在调用页的.csPage_Load事件中增加一行类注册代码

 

 

 

private void Page_Load(object sender, System.EventArgs e)
 {
   
//注册类获得有效的方法
   Ajax.Utility.RegisterTypeForAjax(typeof(AjaxBLLClass));
  }

 

 

 

注意:typeof(AjaxBLLClass)中,AjaxBLLClass是要包含要调用方法的类,即上面第3步新建的业务逻辑类AjaxBLLClass

 

 

 

5. 在调用页页面文件中或者单独写一个js文件,用Javascript代码调用业务逻辑的类的方法。如:

 

 

 

              function classResult()

 

 

 

         {

 

 

 

              var classid=document.getElementById("DropClassID");

 

 

 

              AjaxBLLClass.GetPlaceList(classid.value,get_class_Result_CallBack);//调用业务逻辑类方法

 

 

 

             

 

 

 

         }

 

 

 

 

 

 

         function get_class_Result_CallBack(response)

 

 

 

         {

 

 

 

              if (response.value != null)

 

 

 

              {                   

 

 

 

                   document.getElementById("DropPlaceID").length=0;

 

 

 

               var piArray = response.value.split(",");

 

 

 

          for(var i=0;i<piArray.length;i++)

 

 

 

          {

 

 

 

             var ary1 = piArray[i].toString().split("|");

 

 

 

             document.getElementById("DropPlaceID").options.add(new Option(ary1[1].toString(),ary1[0].toString()));

 

 

 

          } 

 

 

 

                  

 

 

 

              }               

 

 

 

              return

 

 

 

         }

 

 

 

6. 调用

 

 

 

<asp:dropdownlist id="DropClassID" runat="server" Width="250px" onchange= classResult()></asp:dropdownlist>

 

 

 

注:如果是低版本的Ajax需修改Global.asaxApplication_Start事件,设置AjaxHandlerPath

 

 

 

protected void Application_Start(Object sender, EventArgs e)
  {
     
//Ajax.Utility.HandlerPath = "ajax";//老版本的需要
  }

 

 

 

 

 

 

使用感受:个人认为虽然它从一定程度上解决了页面的刷新问题,但却需要写大量的脚本代码,并且和.net的控件和类库结合还不是很好,还不适合在项目里大量地使用,在一些对刷新要求不是太高的地方还是用ASP.NET的编码方式好一些。

 

 

 

 

 

 

示例代码下载

 

 

 

 

 

 

附上一些Ajax资源

 

 

 

http://ajax.schwarz-interactive.de

http://weblogs.asp.net/mschwarz/

 

 

 

http://groups.google.com/group/ajaxpro?lnk=li

 

 

 

MSDN上的Atlas 网站

 

 

 

ASP.NET "Atlas" 官方网站

 

 

 

ASP.NET "Atlas" 预览文档

 

 

 

Atlas  快速入门教程

 

 

 

 

 

 

 

 

 

 

 



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=528165

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

### 使用Transformer模型进行图像分类的方法 #### 方法概述 为了使Transformer能够应用于图像分类任务,一种有效的方式是将图像分割成固定大小的小块(patches),这些小块被线性映射为向量,并加上位置编码以保留空间信息[^2]。 #### 数据预处理 在准备输入数据的过程中,原始图片会被切分成多个不重叠的patch。假设一张尺寸为\(H \times W\)的RGB图像是要处理的对象,则可以按照设定好的宽度和高度参数来划分该图像。例如,对于分辨率为\(224\times 224\)像素的图像,如果选择每边切成16个部分的话,那么最终会得到\((224/16)^2=196\)个小方格作为单独的特征表示单元。之后,每一个这样的补丁都会通过一个简单的全连接层转换成为维度固定的嵌入向量。 ```python import torch from torchvision import transforms def preprocess_image(image_path, patch_size=16): transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), # 假设目标分辨率是224x224 transforms.ToTensor(), ]) image = Image.open(image_path).convert('RGB') tensor = transform(image) patches = [] for i in range(tensor.shape[-2] // patch_size): # 高度方向上的循环 row_patches = [] for j in range(tensor.shape[-1] // patch_size): # 宽度方向上的循环 patch = tensor[:, :, i*patch_size:(i+1)*patch_size, j*patch_size:(j+1)*patch_size].flatten() row_patches.append(patch) patches.extend(row_patches) return torch.stack(patches) ``` #### 构建Transformer架构 构建Vision Transformer (ViT),通常包括以下几个组成部分: - **Patch Embedding Layer**: 将每个图像块转化为低维向量; - **Positional Encoding Layer**: 添加绝对或相对位置信息给上述获得的向量序列; - **Multiple Layers of Self-Attention and Feed Forward Networks**: 多层自注意机制与前馈神经网络交替堆叠而成的核心模块; 最后,在顶层附加一个全局平均池化层(Global Average Pooling)以及一个多类别Softmax回归器用于预测类标签。 ```python class VisionTransformer(nn.Module): def __init__(self, num_classes=1000, embed_dim=768, depth=12, num_heads=12, mlp_ratio=4., qkv_bias=False, drop_rate=0.): super().__init__() self.patch_embed = PatchEmbed(embed_dim=embed_dim) self.pos_embed = nn.Parameter(torch.zeros(1, self.patch_embed.num_patches + 1, embed_dim)) self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim)) dpr = [drop_rate for _ in range(depth)] self.blocks = nn.Sequential(*[ Block( dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, drop=dpr[i], ) for i in range(depth)]) self.norm = nn.LayerNorm(embed_dim) self.head = nn.Linear(embed_dim, num_classes) def forward(self, x): B = x.shape[0] cls_tokens = self.cls_token.expand(B, -1, -1) x = self.patch_embed(x) x = torch.cat((cls_tokens, x), dim=1) x += self.pos_embed x = self.blocks(x) x = self.norm(x) return self.head(x[:, 0]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值