相信你的开发的MVC应用程序中,不止有唯一一个此AutoComplete功能。如果有多个时,或是不断新加时,你的Handlers目录下,肯定会出现多个ashx文件来支持。每增加一个,就会去复制然后修改它。因为这个ashx内处理的是不同类各自的数据。
因此让Insus.NET想起来,是否可以所有AutoComplete只共用一个ashx文件呢? 是否能够解决与实现,但愿尝试一下。
本篇文章,将使用到接口(interface),反射(Reflection)等技术与知识。
为了更生动与演示,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文件还应用了反射(Reflection),即是根据所传入的参数来反射到有实现过接口IAutoCompletable.cs的类。
接下来的工作,是对那存在的两个视图进行修改,每个视图中,只改一句代码:
另一个视图:
将来,再添加另外一个新的AutoComplete功能时,有视图中,再引用此句:
url: "/Handlers/AutoComplete.ashx?tableName=xxx&prefix=" + request.term,
其中xxx是代表你的参考值。