1 综述

InternetRadio项目是一个基于Web2.0理念的面向大众的音乐共享站点,其大量使用了Ajax功能来提高用户的体验效果,并提高数据传输的效率,典型的比如Autosuggest、添加音乐评论等。为了便于相关代码的集中控制,InternetRadio项目从底层封装、Ajax框架选型、代码管理等方面加以控制。
  Ajax框架选型:Prototype提供Ajax封装,Script.aculo.us提供UI封装。
  代码集中管理:在App_Code/BusinessHandler.cs中统一控制Ajax内容的输出。
  Server端底层实现:利用C#的反射机制,实现Ajax客户端对Server端API的调用。

1.1 Ajax和UI框架选型

InternetRadio选用Prototype(http://www.prototypejs.org/)作为底层Ajax底层框架,包括Ajax API封装和 Javascript扩展;另外选择Script.aculo.us(http://script.aculo.us/)作为UI框架,利用其包括Autosuggest等在内的UI特性。
另外,作为辅助,增加Javascript/AjaxPublic.js进一步封装Prototype API,提供一系列方法简化Ajax客户端调用,比如PreparePostData()、AjaxGetFromUrl()、AjaxGetFromUrlSynchronous()等。

1.2 基于反射的Ajax远程调用实现

与Ajax.NET Professional(http://www.ajaxpro.info/)类似,InternetRadio项目也支持Ajax客户端对Server端API的直接调用,比如:
    function Init() {
        new Ajax.Autocompleter(
            '<%=KeywordTextBox.ClientID %>',
            'AutoSuggestion',
            '../BusinessHandler/AutosuggestForKeywordSearch.ajax',
            {
                tokens:",",
                paramName:"ajax_keyword",
                callback: AutoSuggestionCallback
            }
        );
}
在上述代码中,Ajax直接调用Server端BusinessHandler类的AutosuggestForKeywordSearch方法。Suryani.Ajax Project提供了上述调用的支持和实现。
  提供Suryani.Ajax.Service.ServiceManager.Register(string package, Type serviceType)方法,用于注册要开放给客户端Ajax调用的类。ServiceManager将所注册的类保存在全局变量modules中。
  开放Suryani.Ajax.Utility.AjaxConfiguration.Register(Dictionary<string, Type> source)供Global.asax调用,用于在Website启动时向Server注册全部要开放给客户端调用的类。AjaxConfiguration.Register()方法调用ServiceManager.Register()方法完成所有类的注册。
  增加Suryani.Ajax.Service.AjaxMethodAttribute自定义标签类,用于标识要开放给客户端调用的类方法。Suryani.Ajax.Service.ServiceManager.Register()方法将遍历所注册类的全部方法,将附加AjaxMethod自定义标签的所有方法保存在modules全局变量中,以备客户端Ajax调用。
  提供Suryani.Ajax.Service.AjaxHttpHandler自定义HttpHandler类,拦截来自客户端的所有Ajax 请求(该请求的URL以".ajax"结尾),解析URL,利用反射的原理从全局变量modules中获取已注册的类和方法,并将执行结果输出到客户端。

初始化并注册类

Ajax远程调用Server端API的过程

1.3 Ajax代码集中管理

由于InternetRadio项目中大量用到Ajax功能,客户端Ajax可以直接调用Server端的API,而且每一个Ajax请求都需要Server端根据请求组织要交付Browser端的内容。为了对这些代码集中管理,我们在App_Code中增加了BusinessHandler类,作为Browser端与Server端的中介,负责请求的响应和内容的组织。而且整个项目中,只开放BusinessHandler供客户端直接调用调用。比如:
/// <summary>
/// 根据标签关键词搜索对应的标签
/// </summary>
/// <param name="keyword"></param>
 [AjaxMethod]
public string FindTagsByKeyword(string keyword)
{
    StringBuilder builder = new StringBuilder();
    try
    {
       IList<Tag> tags = TagManager.FindTagsByKeyword(keyword);
       if (tags != null)
       {
           builder.Append("<ul>");
           foreach (Tag tag in tags)
           {
                builder.Append(string.Format(CultureInfo.CurrentCulture, "<li>{0}</li>", tag.TagName));
           }
           builder.Append("</ul>");
       }
     }
     catch { }
     return builder.ToString();
}

1.4 典型应用

1.4.1 简单的Ajax应用:添加歌曲标签

URL:http://nyxm.vicp.net:5052/Music/Music.aspx?MusicId=26553
功能描述:为当前歌曲添加相应的自定义标签
程序主文件:UserControl/MusicInfoControl.ascx
代码流程:
  单击"保存"按钮:SaveTagButtonOnClick()
function SaveTagButtonOnClick()
{
    var tagName = $('<%= TagNameTextBox.ClientID %>').value;
    var musicId=$('<%= MusicIdHiddenField.ClientID %>').value;
    var url = "/BusinessHandler/AddTag.ajax?ajax_tagName=" + encodeURIComponent(tagName) + "&ajax_musicId="+musicId;
    AjaxGetFromUrl(url,SaveTagCallBack);
    $('<%= TagNameTextBox.ClientID %>').value="";
}
调用AjaxGetFromUrl()方法,通过Prototype向Server端发起Ajax请求。
  AjaxHttpHandler拦截到Ajax请求,执行BusinessHandler.AddTag()方法,向Browser输出以<span>形式组织的标签列表:
/// <summary>
/// 添加歌曲的标签
/// </summary>
/// <param name="tagName"></param>
/// <param name="musicId"></param>
[AjaxMethod]
public string AddTag(string tagName, int musicId)
{
    int userId = ContextAccessor.Current.UserId;
    string createBy = ContextAccessor.Current.UserName;
    TagManager.Add(tagName, createBy, musicId, userId);
    IList<Tag> tags = TagManager.FindTagsByMusicId(musicId);
    StringBuilder returnString = new StringBuilder();
    foreach (Tag tag in tags)
    {
 returnString.Append("<span>");
 returnString.Append(PageContentBuilder.BuildTagSearchLink(tag.TagName, tag.TagName));
 returnString.Append("</span>&nbsp;&nbsp;\n");
    }
    return returnString.ToString();
}
  回调函数SaveTagCallBack()检测到 Server端返回的标签列表,将其呈现在页面上:
function SaveTagCallBack(request)
{   
    $('TagListDiv').innerHTML = request.responseText;
}
 

1.4.2 结合Script.aculo.us的应用:Autosuggest

URL:http://nyxm.vicp.net:5052/Index.aspx
功能描述:根据关键词框的输入,自动提示补录。
程序主文件:UserControl/ QuickSearchControl.ascx
代码流程:
  页面初始化:
当页面载入的时候,利用Script.aculo.us的Autocompleter控件实现对关键词输入框的监控。
function Init() {
    new Ajax.Autocompleter(
        '<%=KeywordTextBox.ClientID %>',
        'AutoSuggestion',
        '../BusinessHandler/AutosuggestForKeywordSearch.ajax',
        {
            tokens:",",
            paramName:"ajax_keyword",
            callback: AutoSuggestionCallback
 }
    );
}
Event.observe(window,'load',Init);
  当用户在关键词输入框输入关键词时,Autocompleter控件向Server端发起Ajax请求,检索提示内容。AjaxHttpHandler拦截该请求,执行BusinessHandler.AutosuggestForKeywordSearch()方法:
/// <summary>
/// 根据关键词检索对应的音频
/// </summary>
/// <param name="searchType"></param>
/// <param name="keyword"></param>
/// <returns></returns>
[AjaxMethod]
public string AutosuggestForKeywordSearch(string searchType, string keyword)
{
    if (searchType.Equals(WebConstants.Search_Player, StringComparison.OrdinalIgnoreCase))
    {
        return FindPlayersByKeyword(keyword);
    }
    else if (searchType.Equals(WebConstants.Search_Music, StringComparison.OrdinalIgnoreCase))
    {
        return FindMusicByKeyword(keyword);
    }
    else if (searchType.Equals(WebConstants.Search_Tag))
    {
        return FindTagsByKeyword(keyword);
    }
    return string.Empty;
}
Server端以无序列表<ul>的形式组织返回给Browser端的Autosuggest内容列表。
  回调函数AutoSuggestionCallback()将Autosuggest内容呈现在页面上:
function AutoSuggestionCallback(obj) {
    var searchType = "Player";
    if($("<%=PlayerRadioButton.ClientID %>").checked == true) searchType = "Player";
    else if($("<%=MusicRadioButton.ClientID %>").checked == true) searchType = "Music";
    else if($("<%=TagRadioButton.ClientID %>").checked == true) searchType = "Tag";
    return "ajax_searchType="+searchType+"&ajax_keyword="+ encodeURIComponent(obj.value);
}

转载于:https://www.cnblogs.com/suryani/archive/2008/09/03/1282676.html

[项目总结-原创]InternetRadio项目Ajax技术方案选型相关推荐

  1. 多端统一技术方案选型

    文章目录 概述 需求目的 考虑因素 项目因素 团队因素 技术因素 技术选型 候选技术 初步筛选 详细对比 多端支持 流行活跃度 开发工具 组件库/工具库/Demo 实践反馈 支持宝小程序 百度小程序 ...

  2. Flutter UI自动化测试技术方案选型与探索

    Flutter页面无法直接使用Native测试工具定位元素,给自动化测试带来很多不便.虽然Google官方推出了Flutter driver 和 Integration test,但是在实际使用中存在 ...

  3. Flutter UI自动化测试技术方案选型与探索,初面蚂蚁金服

    •不适用于混合栈APP,虽然appium中有相关的driver,但是无法切换环境.•元素定位能力相对薄弱.•依赖于VMService,需要构建Profile或Debug包. 基于以上因素,我们并没有直 ...

  4. 联咏(Novatek)NT98562/NT98566/NT96565|SDK海思HI3516EV200/V300技术方案选型

    Novatek 联咏#NT98562.NT98566#,#内置DDR,4lane双sensor输入,继HI3516EV200/EV300之后的新选择 联咏NT9656x参数: 内置DDR,可以进一步压 ...

  5. 被同事嘲笑说技术方案没深度?

    大家好,我是Z哥. 程序员群体中有个很好玩的现象. 工作年限短的程序员热衷于设计"高大上"的技术方案,而工作年限长的则对技术方案好像不太感冒,上手就撸代码. 然后呢,年限短的程序员 ...

  6. 关于低代码技术方案调研

    文章目录 现状 一般分工 国内低代码平台 全栈平台 页面搭建 店铺装修 办公/管理系统 a.k.a no-code 技术攻关内容 技术方案选型思考 开源自研方案推荐 jeecg简介 架构 技术栈 产品 ...

  7. 图分析引擎技术方案调研

    图分析引擎-技术调研报告 先上调研结论: 金融领域相关图分析图查询引擎的建设,建议采用neo4j为内核进行研发图谱集群,可以部署到云平台自主运维或者选择服务厂商完全托管(建议自主运维):内核的选择,建 ...

  8. 招生报名小程序开发笔记一:开发背景和技术方案的选型确定

    业务背景 对每所学校而言,每年招生入学工作启动后,都免不了信息登记.现场报名.普查审核等多个阶段.特别是来到现场报名审核环节时,以往都是学校公众号发个通知,家长们在开放现场登记的那几天,自己找时间过来 ...

  9. 运营方案要包括哪些内容_施工招标项目技术方案编制的内容包括哪些?

    为更好地发挥施工方案的指导作用,做好施工准备工作.搞好人力.物力.财力的统筹安排.开工前对各级组织进行生产.技术交底,以及制定关键部位的操作工艺.规程与保证措施,做到有组织.有计划.有步骤地实施,进而 ...

  10. 5万字企业数字化运营管理平台软件开发框架项目技术方案

    目录 1 项目总体概述 项目总体技术方案保障 系统设计 系统体系结构设计 系统指标保障 系统质量 系统健壮性 系统应具备安全性 系统易用性 系统可维护性 系统完备性 系统可扩展性 系统可测试性 系统可 ...

最新文章

  1. 程序、进程、线程区别与联系
  2. OSChina 周一乱弹 —— 抱着漂亮袜子就亲了一口
  3. 怎么制作升温曲线图_利用金字塔原理制作PPT,完整有逻辑
  4. 平方环法_2019环法挑战赛加速诸暨“运动之城”建设 推动“体育+旅游”新热潮...
  5. mysql下载64位 csdn_Linunx-CentOS7安装mysql-5.7.23-linux-glibc2.12-x86_64.tar
  6. python小游戏之三
  7. Linux工作笔记-使用SCP文件协议(SSH协议22端口)使Windows与Linux互传文件
  8. Invalidate,Update与Refresh的区别
  9. SQL Server 常用函数总结
  10. c语言中按字节运算,C语言中位运算的巧用
  11. Java中递归复制多级文件夹(IO流)
  12. atan和atan2反正切计算
  13. 掌握C语言判断素数(质数)相关内容
  14. Python打包exe文件并换图标【最强版教程】
  15. 什么是ISCSI?ISCSI又能干什么呢?
  16. Powerdesigner概念模型并将概念模型转换成物理模型
  17. C++ 小游戏 视频及资料集(9)
  18. Dubbo之@Adaptive
  19. java 接口 实验报告_java-接口练习实验报告
  20. 【推荐系统】User-Item CF:GC-MC

热门文章

  1. 《你的灯亮着吗》读书笔记2
  2. mysql left join右边有多条_left join 右表多条数据重复
  3. 动态启用和禁用mainfest中组件
  4. js高级学习笔记(b站尚硅谷)-9-原型链相关知识
  5. netstat 查看网络连接、路由表、接口状态、端口信息
  6. python查找客户总金额_如何使用python中的spark查找每个月的总金额
  7. python中rename函数_python-重命名Pandas Groupby函数中的列名
  8. k8s pod部署到不同node_应用部署演进(二)
  9. dd命令打包多个文件_linux下如何tar打包多个并列文件夹,如:将a文件夹 b文件夹 c文件夹,打包成d.tar文件...
  10. linux vnc开启防火墙,[转载]CentOS 6.0 下 VNC 配置方法(带防火墙配置)