先看此篇《MVC程序实现Autocomplete功能》 http://www.cnblogs.com/insus/p/3546255.html 它是实现使用jQuery实现文本框输入文字,出现下拉列表,自动完成与选择功能。
相信你的开发的MVC应用程序中,不止有唯一一个此AutoComplete功能。如果有多个时,或是不断新加时,你的Handlers目录下,肯定会出现多个ashx文件来支持。每增加一个,就会去复制然后修改它。因为这个ashx内处理的是不同类各自的数据。
因此让Insus.NET想起来,是否可以所有AutoComplete只共用一个ashx文件呢?
是否能够解决与实现,但愿尝试一下。
本篇文章,将使用到接口(interface),反射()等技术与知识。
为了更生动与演示,Insus.NET根据前一篇的例子,再添加了另外一个AutoComplete:
打开两个Handlerx.ashx文件,对比与发现:
只有高亮部分不相同,那是各自类实例化。
没有关系,你懂得.NET编程,可以抽象或是接口它们。在此Insus.NET使用的是接口。
在MVC在应用程序的Interfaces目录下,创建一个IAutoCompletable接口:
接口实现了,程序将来再的AutoComplete功能实现,在Entity类别中实现这个接口即可,不过现在对已经实现了的Entity,分别打开它来重新实现即可:
看看PinYinEntity.cs被改成怎样了:
另外的AbbreviatorEntity.cs类:
两个类都实作了接口,并返回了接口函数据类型DataTable。以后有新的此类功能添加时,commentout的方法代码,就不必再写了。
看到这里,我们在上两个类中,每个类别被commentout的语法中,还有一句是被划掉的,它是的意思是把DataTable转换为List<T>的。我可以再回过头去看Handlerx.ashx文件,在#25~#26行代码,它的意思是把List<T>系列化对象。
根据这两处代码,Insus.NET决定另外写一个共同函数整合,是对DataTable系列化的方法:
下面Insus.NET在Handlers目录下,写一个AutoComplete.ashx文件,将替代以前Handlerx.ashx文件:
将来所有jQuery想实现AutoComplete的功能,只需要引用此文件即可。此文件有添加多一个参数,Insus.NET是以数据表名来区别,当然你也可以按你的想法来定义这个参数。
string tableName = context.Request["tableName"];
此ashx文件还应用了反射(
接下来的工作,是对那存在的两个视图进行修改,每个视图中,只改一句代码:
将来,再添加另外一个新的AutoComplete功能时,有视图中,再引用此句:
url: "/Handlers/AutoComplete.ashx?tableName=xxx&prefix=" + request.term,
下面是MVC应用程序练习最新源代码与数据库备份文件。
程序是.NET Framework 4.5, 数据库为SQL Server
2012:
http://download.cnblogs.com/insus/MVC/InsusMVCSiteCS_2014_Feb14.rar