源码信息

最新源码评论

综合讨论 下载前咨询( 1 人) | 下载后讨论( 1 人 )

  • 评论者:寒冰神掌***
    寒冰神掌***(用户) 发表于:2012-08-27 15:55:59

    感谢分享,对我很有帮助!顶起哈。

    0 个回复
  • 评论者:51asp***
    51asp***(编辑) 发表于:2008-04-17 15:44:00

    在讲解源码之前,这里先简单说说系统运行的几个事项。虽然下载的压缩包中已经包含了简单的说明,但有一个重点没有强调,也就是虽然这个系统会在启动的时候自动创建数据库表结构,但他是不能自动创建数据库的,因此在启动之前需要自己手动创建数据库,比如VifirBlog,在后续版本中将增加自动建库功能。<br/>数据库的配置是在Web.config文件中,在启动应用程序时,需要修改Web.config文件中的数据库配置,把用户名及密码根据你的情况进行修改,数据库的配置内容如下:<div class="blockcode"><div id="code_-1"><ol><li>&lt;databaseSettings&gt;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;add key=&quot;db.datasource&quot; value=&quot;(local);Integrated Security=true&quot;/&gt;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;add key=&quot;db.user&quot; value=&quot;sa&quot;/&gt;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;add key=&quot;db.password&quot; value=&quot;sa&quot;/&gt;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;add key=&quot;db.database&quot; value=&quot;vifirblog&quot;/&gt;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;add key=&quot;db.generateDdl&quot; value=&quot;true&quot;/&gt;<br/></li> <li> &lt;/databaseSettings&gt;<br/></li> <li> &lt;appSettings&gt;<br/></li> </ol></div><em onclick="copycode($('code_-1'));">复制代码</em></div>db.datasource表示数据源,默认是SQL Server的,当然你可以选择使用MySQL、Oracle等各种数据源,其中db.user表示用户名,db.password表示密码,db.database表示数据库名,db.generateDdl表示是否让程序启动的时候自动生成表系统所需要的表结构。db.generateDdl默认为true,第一次运行成功后会自动建表结构,然后请手动修改成false这样下次再启动就不会再建表结构了。<br/>压缩后的文件结构是一个VS项目文件,如下图所示:<img src="http://bbs.51aspx.com/upload/auto/2_080417034336235.jpg" border="0" onload="thumbImg(this)" /><br/><br/>&nbsp;&nbsp;<br/>如果你机器上安装了VS2005(SP1)以上的版本,那么理论上应该可以直接双击Vifir.Web.sln这个文件来实现在VS中打开项目(如果装的VS版本打不开的话,那么你就得好好想办法了),如下图所示:<br/><img src="http://bbs.51aspx.com/upload/auto/2_080417034337517.jpg" border="0" onload="thumbImg(this)" /><br/><br/>项目打开后,大家可以直接打开Web.config文件,重点看看databaseSettings一节的配置,确认没问题后,可以直接点击上面的运行按钮来运行项目。<br/>&nbsp;&nbsp;启动后即可进行Blog后台管理页面的登录页面,演示系统的用户名及密码均为admin,直接输入后按登录即可进入系统。如下图所示:<br/><img src="http://bbs.51aspx.com/upload/auto/2_080417034338063.jpg" border="0" onload="thumbImg(this)" /><br/><br/><br/>&nbsp;&nbsp;<br/>进入后可以先进入日志目录管理,程序主区域会出现一个还算漂亮的可编辑表格,可以点击上面的按钮添加日志分类等,并在右边的表格中直接编辑各表格荐的内容。如下图所示:<br/><img src="http://bbs.51aspx.com/upload/auto/2_080417034338298.jpg" border="0" onload="thumbImg(this)" /><br/>&nbsp;&nbsp;到这里,这个.Net版的程序就算成功跑起来了。至于系统其它的功能,你就得慢慢体验了,用Ext做的更多实用功能(像在线聊天、在线课堂等),可以直接到<a href="http://www.vifir.com/my.html" target="_blank"><font color="#7297ce">http://www.vifir.com/my.html</font></a>中进行实地体验。下面我们重点对本项目的代码作简单的解析。<br/>由于这里主要演示的是ExtJS与.Net结合应用,因此一个核心就是ExtJS部分,打开manage/Default.aspx中的源代码,可以得到如下的内容:<div class="blockcode"><div id="code_0"><ol><li> <br/></li> <li>&lt;%@ Page Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot; CodeBehind=&quot;Default.aspx.cs&quot; Inherits=&quot;Vifir.Web.manage.Default&quot; %&gt;<br/></li> <li>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br/></li> <li>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.1//EN&quot; &quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&quot;&gt;<br/></li> <li>&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;<br/></li> <li>&lt;head&gt;<br/></li> <li>&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;<br/></li> <li>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../plugins/extjs/ext-2.0/resources/css/ext-all.css&quot; /&gt;<br/></li> <li>&lt;style type=&quot;text/css&quot;&gt;<br/></li> <li>a{}{ text-decoration:none; color:#000033 }<br/></li> <li>.link{}{<br/></li> <li>font-weight:bold;<br/></li> <li>padding:6px 0 0 -2px;<br/></li> <li>line-height:25px;<br/></li> <li>}<br/></li> <li>&lt;/style&gt;<br/></li> <li>&lt;title&gt;Blog后台管理&lt;/title&gt;<br/></li> <li>&lt;/head&gt;<br/></li> <li>&lt;body style=&quot;font-size:12px&quot;&gt;<br/></li> <li>&nbsp;&nbsp;&lt;div id=&quot;loading-mask&quot; style=&quot;&quot;&gt;&lt;/div&gt;<br/></li> <li>&nbsp;&nbsp;&lt;div id=&quot;loading&quot;&gt;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;div style=&quot;text-align:center;padding-top:25%&quot;&gt;&lt;img src=&quot;../images/extanim32.gif&quot; width=&quot;32&quot; height=&quot;32&quot; style=&quot;margin-right:8px;&quot; align=&quot;absmiddle&quot;/&gt;Loading&lt;/div&gt;<br/></li> <li>&nbsp;&nbsp;&lt;/div&gt;<br/></li> <li>&lt;script type=&quot;text/javascript&quot; src=&quot;../plugins/extjs/ext-2.0/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;<br/></li> <li>&lt;script type=&quot;text/javascript&quot; src=&quot;../plugins/extjs/ext-2.0/ext-all.js&quot;&gt;&lt;/script&gt;<br/></li> <li>&lt;script type=&quot;text/javascript&quot; src=&quot;manage.js&quot;&gt;&lt;/script&gt;<br/></li> <li>&lt;script type=&quot;text/javascript&quot; src=&quot;core.js&quot;&gt;&lt;/script&gt;<br/></li> <li>&lt;script type=&quot;text/javascript&quot; src=&quot;topic.js&quot;&gt;&lt;/script&gt;<br/></li> <li>&lt;script type=&quot;text/javascript&quot; src=&quot;album.js&quot;&gt;&lt;/script&gt;<br/></li> <li>&lt;/body&gt;<br/></li> <li>&lt;/html&gt;<br/></li> </ol></div><em onclick="copycode($('code_0'));">复制代码</em></div>其对应的Default.aspx.cs文件内容如下:<div class="blockcode"><div id="code_1"><ol><li>namespace Vifir.Web.manage<br/></li> <li>{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;public partial class Default : System.Web.UI.Page<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected void Page_Load(object sender, EventArgs e)<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!UserContext.isAdmin())//如果没有登录<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Redirect(&quot;login.html&quot;);//跳转到登录页面<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> <li>}<br/></li> </ol></div><em onclick="copycode($('code_1'));">复制代码</em></div>在manage/Default.aspx中,我们没有引入任何特殊的服务器控件,基本上就是普通的html,注意包含了很多的js文件。其中../plugins/extjs/ext-2.0/adapter/ext/ext-base.js及../plugins/extjs/ext-2.0/ext-all.js是Ext的库文,而manage.js、core.js、topic.js、album.js等是我们本系统中编写的ExtJS应用文件,那些艳丽的界面都是直接在这些js文件中调用ExtJS的组件生成的。对于不熟悉Ext的朋友们来说,我推荐直接通过《ExtJS实用开发指南》来进行一个系统的学习、并且可以把《指南》作为日常的参考书籍。而对于熟悉Ext并且希望进一步提升的朋友们来说,我建议你直接看《Wlr单用户Blog系统源码详细开发文档》,该文档中包含了对我们这里用到的manage.js、core.js、topic.js、album.js等文件作了较为详尽的讲解及分析。<br/>由于这里是一个基于DotNet平台的应用,因此我们重点来看看后台管理部分。后台管理的程序在manage目录中,包含Album.aspx、AlbumCategory.aspx、Topic.aspx、TopicCategory.aspx、Blog.aspx、Link.aspx、User.aspx、Comment.aspx等等。经常搞Asp.Net开发的朋友一定会迫不急待的点开这些扩展名为.aspx的文件想看过究竟,看看这些文件是如何与客户端交付、使用了哪些控件、如何产生JSON、如何访问数据库、SQL语句如何写等。但我想点开后你一定会有所失望了,因为点开这些文件后你会发现里面几乎什么东西都没有。比如Topic.aspx文件中只包含下面一句大家平时瞟都不会瞟一眼的代码:<br/>&lt;%@ Page Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot; CodeFile=&quot;Topic.aspx.cs&quot; Inherits=&quot;manage_Topic&quot; %&gt;<br/>当然,你一定猜到我们一定把处理这些内容的东西都放下面的Topic.aspx.cs文件中了,恭喜你,完全正确!我们重点应该是看aspx下面的C#类文件,比如Topic.aspx.cs,如下图所示:<br/><img src="http://bbs.51aspx.com/upload/auto/2_080417034338720.jpg" border="0" onload="thumbImg(this)" /><br/><br/>由于每一个模块要实现的功能本来就是相似的,使得这些代码都是模板化的,所以你打开其它的Link.aspx.cs、User.aspx.cs、TopicCategory.aspx.cs都会看到类似的内容,只要搞懂一个,其它的举一反三自然就都懂了。而且在实际开发中,这些代码还真不需要用手来写(那么用什么呢?当然是用机器人了,简单写一个代码生成工具,替换一下名称就给你搞定了!)。因此,下面我们来重点看看Topic.aspx.cs的源代码,其全部内容如下:<div class="blockcode"><div id="code_2"><ol><li> <br/></li> <li>using System;<br/></li> <li>using System.Data;<br/></li> <li>using System.Configuration;<br/></li> <li>using System.Collections;<br/></li> <li>using System.Web;<br/></li> <li>using System.Web.Security;<br/></li> <li>using System.Web.UI;<br/></li> <li>using System.Web.UI.WebControls;<br/></li> <li>using System.Web.UI.WebControls.WebParts;<br/></li> <li>using System.Web.UI.HtmlControls;<br/></li> <li>using Vifir.Model.Service;<br/></li> <li>using Vifir.Core;<br/></li> <li>using Vifir.Model.Domain;<br/></li> <li>using Vifir.Web.Code;<br/></li> <li>public partial class manage_Topic : BaseAction<br/></li> <li>{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;private ITopicService service;&nbsp;&nbsp; <br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;private ITopicCategoryService categoryService;<br/></li> <li> <br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;public ITopicService Service<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set { service = value; }<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;public ITopicCategoryService CategoryService<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set { categoryService = value; }<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;public void List()<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryObject qo = new QueryObject();<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ToPo(qo);<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string categoryId = Request.Params[&quot;categoryId&quot;];<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (categoryId != null &amp;&amp; !&quot;&quot;.Equals(categoryId))<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qo.addQuery(&quot;obj.Category.id&quot;, long.Parse(categoryId), &quot;=&quot;);<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPageList pageList = service.getTopicBy(qo);<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonResult = pageList;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;public void Remove()<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long id = long.Parse(Request.Params[&quot;id&quot;]);<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service.delTopic(id);<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonResult = true;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;public void Save()<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Topic obj = new Topic();<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ToPo(obj);<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string CategoryId = Request.Params[&quot;CategoryId&quot;];<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (CategoryId != null &amp;&amp; !&quot;&quot;.Equals(CategoryId))<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TopicCategory c = this.categoryService.getTopicCategory(long.Parse(CategoryId));<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj.Category = c;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!HasError())<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; service.addTopic(obj);<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extFormResult = true;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;public void Update()<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long id = long.Parse(Request.Params[&quot;id&quot;]);<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Topic obj = service.getTopic(id);<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ToPo(obj);<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string CategoryId = Request.Params[&quot;CategoryId&quot;];<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (CategoryId != null &amp;&amp; !&quot;&quot;.Equals(CategoryId))<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TopicCategory c = this.categoryService.getTopicCategory(long.Parse(CategoryId));<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.Category = c;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!HasError())<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service.updateTopic(id, obj);<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extFormResult = true;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> <li>}<br/></li> </ol></div><em onclick="copycode($('code_2'));">复制代码</em></div>Topic.aspx用来实现日志的添加、修改、删除、分页查询、排序等一系列的功能,我们可以理解为日志管理模块。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前面的一大堆using我想不用多说,你应该知道就是引入需要用到的包package(或命名空间),其中的System.XX的我想你是见多了,不会有什么疑问,而Vifir.XX是本系统的域模型、业务逻辑层接口等,另外还包含Vifir的核心类库,你直接像System.XX里面的东西一样在该用的时候使用是了。(备注:Vifir.Model是本系统的后台业务逻辑,如果你是Vifir的VIP用户,则应该还能够直接下载他的源代码,我也会在后面的文章中对Vifir.Model中的源码进行具体的分析,Vifir.Core是Vifir提供的一个简单Ajax、Ext支持及企业应用快速开发的开发库,不是开源项目,但可以免费使用,所以想看他源代码的就只有加入到Vifir团队中才有可能了。当然,看不到也没关系,想想我们虽然没看到.net类库里面的一句代码,还不是照样屁颠屁颠地用着!)。<br/>下面我们来看看类的声明,代码如下: <br/>class manage_Topic : BaseAction<br/>直接继承自BaseAction,而不是传统的System.Web.UI.Page,BaseAction.cs在Code目录,直接打开可以看到下面的代码:<div class="blockcode"><div id="code_3"><ol><li>public abstract class BaseAction : Vifir.Core.Web.AbstractCmdPage<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected new void Page_Load(object sender, EventArgs e)<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!UserContext.isAdmin())<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Redirect(&quot;login.html&quot;); <br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base.Page_Load(sender, e);<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> </ol></div><em onclick="copycode($('code_3'));">复制代码</em></div>从代码中我们可以看出,该类继承自Vifir.Core.Web.AbstractCmdPage,AbstractCmdPage类是从EasyJF开源团队的EasyJWeb这个开源MVC框架中借鉴来类,用于在Vifir提供用于开发ExtJS的底层开发库,包含了命令处理、JSON数据处理、Ext表单交互及VO转换成PO等实用方法。如果你对这些内容感兴趣,那么欢迎你直接下载EasyJWeb(官方网址: <a href="http://www.easyjf.com/easyjweb/index.html" target="_blank">http://www.easyjf.com/easyjweb/index.html</a>)的源代码来看看即可(其实虽然研究DotNet没多久,但发现.Net的很多东西、特别是设计思想,有不少是得益于Java领域、特别是开源领域的贡献),因此也劝广大的DotNe用户有空时了关注一下Java,他也许能让你走在前面。<br/> BaseAction中包含了Page_Load方法的公共实现,用来实现用户登录检查的功能,这里通过调用业务逻辑层的UserContext.isAdmin()来判断是否登录,如果没有登录则把页面导向login.html。如果登录,则直接调用父类(也就是AbstractCmdPage)中的Page_Load方法来处理用户的请求。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/> 回到Topic.aspx.cs,继续往下看,我们可以看到service及categoryService字段及属性的声明,在定义Service及CategoryService属性的时候只设置了set方法,因为该模块中的属性基本上,也不可能给其它程序使用,所以不需要设置get。<br/> 下面来看List方法,该方法的签名为public void List(),是一个普通的方法而已,当用户在地址栏中输入Topic.aspx?cmd=List的时候,会调用该方法中的内容执行。该方法实现的功能是调用业务逻辑层提供的业务方法getTopicBy,来获得日志信息。getTopicBy方法需要一个参数,即类型为IQueryObject的对象,该对象中包含了分页及排序的一些相关信息。IQueryObject的一个默认实现的QueryObject,我们直接调用即可。下面是List方法中的代码及注解:<div class="blockcode"><div id="code_4"><ol><li>public void List()<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>QueryObject qo = new QueryObject();//创建一个分页查询对象<br/></li> <li>ToPo(qo);//把前台传来参数,如分页信息以对象中<br/></li> <li>string categoryId = Request.Params[&quot;categoryId&quot;];//得到前台传来的categoryId参数<br/></li> <li>if (categoryId != null &amp;&amp; !&quot;&quot;.Equals(categoryId))<br/></li> <li>{<br/></li> <li>&nbsp;&nbsp;qo.addQuery(&quot;obj.Category.id&quot;, long.Parse(categoryId), &quot;=&quot;);//指定只查询某一个分类中的日志信息<br/></li> <li>}<br/></li> <li>IPageList pageList = service.getTopicBy(qo);//调用业务逻辑层的getTopicBy方法来查询日志,该方法返回的是一个包含了数据分页及内容的IPageList对象。<br/></li> <li>jsonResult = pageList;//把返回的结构保存到jsonResult中,并作为JSON数据输出。<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></li> </ol></div><em onclick="copycode($('code_4'));">复制代码</em></div>整个方法的代码如果把处理日志分类的部分去掉的话,就会显得更加简洁了,Web层的东西嘛,就是要追求越简洁越好,最好什么都没有才好维护。不需要专门处理JSON输出,也不需要根据不同的数据库写一句SQL语句,更不需要计算页码多少、处理排序字段等等,一切交给Vifir提供的类库来处理就OK了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>List方法的代码看完了,我们接下来看看Remove方法,该方法就是简单地根据前台传进来的参数id,调用业务逻辑层的delTopic方法来删除指定日志,代码及注解如下:<div class="blockcode"><div id="code_5"><ol><li>public void Remove()<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long id = long.Parse(Request.Params[&quot;id&quot;]);//获得前台传来参数id并转换成long<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service.delTopic(id);//调用业务层的delTopic方法删除指定日志 <br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extFormResult = true;//指定返回ExtJS表单能识别的数据<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;} <br/></li> </ol></div><em onclick="copycode($('code_5'));">复制代码</em></div>然后下面是Save及Update方法的源代码,他们都是用来保存数据,Save是用来保存新增加的日志,而Update用来保存修改的日志。跟前面的方法一样,这些方法都是简单的调用业务逻辑层指定方法来实现日志的保存、修改等功能。下面我们来看看Save方法的源码及注释:<div class="blockcode"><div id="code_6"><ol><li>public void Save()<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;{<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Topic obj = new Topic();//新建一个Topic对象<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ToPo(obj);//把表单中传的内容保存到对象obj中,比如表单的title字段值或保存到obj的Title属性中,content或Content字段值会保存到obj的Content属性中,有多少保存多少。<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string CategoryId = Request.Params[&quot;CategoryId&quot;];//得到日志分类ID<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (CategoryId != null &amp;&amp; !&quot;&quot;.Equals(CategoryId))<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TopicCategory c = this.categoryService.getTopicCategory(long.Parse(CategoryId));//调用业务逻辑方法得到指定分类id对应的TopicCategory对象<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj.Category = c;//设置Topic对象的Category值,也就是设置日志分类<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!HasError())//如果没有错误<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; service.addTopic(obj);//调用业务层的addTopic方法来实现添加日志<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extFormResult = true;//设置extFormResult的值为true,返回ExtJS表单Action能识别的JSON数据<br/></li> </ol></div><em onclick="copycode($('code_6'));">复制代码</em></div>}如果你不知道什么是IOC,那么你一定会疑惑,在上面的代码中ITopicService只是一个接口,也就是service只是一个接口,而且我们在代码中没给其设置过值,他的实现类具体是什么等。那么请你打开bin目录中的Web.xml这个文件,这是一个Spring.NET的配置文件,在该配置文件中可以配置各个类及业务组件之间的依赖关注,并给相关类注入依赖的对象。比如配置Topic.aspx.cs类的配置信息如下:<div class="blockcode"><div id="code_7"><ol><li>&lt;object type=&quot;manage/Topic.aspx&quot;&gt;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name=&quot;Service&quot; ref=&quot;topicService&quot; /&gt;<br/></li> <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name=&quot;CategoryService&quot; ref=&quot;topicCategoryService&quot; /&gt;<br/></li> <li>&nbsp;&nbsp;&lt;/object&gt;<br/></li> </ol></div><em onclick="copycode($('code_7'));">复制代码</em></div>这使得在创建Topic.aspx对应的类实例时,会自动从容器找到名为topicService及topicCategoryService的组件,并注入到Service及CategoryService两个属性中。<br/> <br/>关于IOC及Spring.NET,请直接访问Spring.NET的官方网站<a href="http://www.springframework.net" target="_blank">www.springframework.net</a>。<br/> <br/>当然,本示例还引入了一些前沿的后台技术,比如泛型DAO、ORM等。

    7 个回复
    • 回复者:lswin***
      lswin***(用户)回复于:2008-04-18 20:46:00

      是用什么机器人呢?什么工具可以生成代码的??麻烦告诉我哦。谢谢了!!!

    • 回复者:lswin***
      lswin***(用户)回复于:2008-04-18 10:13:00

      而且在实际开发中,这些代码还真不需要用手来写(那么用什么呢?当然是用机器人了,简单写一个代码生成工具,替换一下名称就给你搞定了!)。<br/><br/>这句话不是很明白,是用什么机器人呢?什么工具可以生成代码的??麻烦告诉我哦。谢谢了!!!

    • 回复者:crazy***
      crazy***(用户)回复于:2008-04-25 11:33:00

      好东西,谢谢啦!~早研究Ext咯就是没有.NET下的 这个ExtJsExtenderControl是个好东西打算用的朋友可以看下

    • 回复者:Rocky***
      Rocky***(用户)回复于:2008-10-18 16:19:00

      好东东,期待老大一直更新!

    • 回复者:wangy***
      wangy***(用户)回复于:2008-04-25 17:39:00

      看到你上面有可以改变文字大小的内容,本想进来看看你是怎么实现的,可是看了代码,好像没有我想要的。。不知道你做过没,可以给个例子看吗?

    • 回复者:alang***
      alang***(用户)回复于:2008-05-16 14:44:00

      为什么我在IE里打开时总是在等待着Loading..... 根本进不得,在VS2005工程运行也是一样<br/><br/>可我生成后在IIS里浏览就正常!奇怪了

    • 回复者:rufus***
      rufus***(用户)回复于:2008-12-04 10:06:00

      public static string GetJSON(object value)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HandleJSON V_0 = new HandleJSON();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return V_0.getJSON(value);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private class HandleJSON <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private IDictionary vars = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private IList stack = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private IList declars = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private int d=0;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public HandleJSON()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.vars = new Hashtable();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.stack = new ArrayList();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.declars = new ArrayList();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.d = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public string getJSON(object value)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int V_2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string V_0 = this.generatorJSON(value);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string V_1 = &quot;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (V_2 = 0; V_2 &lt; this.declars.Count; V_2++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V_1 = V_1 + this.declars[V_2];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (V_2 = 0; V_2 &lt; this.stack.Count; V_2++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V_1 = V_1 + this.stack[V_2];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (V_1 + &quot;return &quot; + V_0 + &quot;;&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public bool IsSimpleType(Type type)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (type.IsPrimitive || type.Equals(typeof(string))) || (type == typeof(DateTime));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public string generatorJSON(object value)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string V_0 = &quot;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string V_1 = &quot;v&quot; + d++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (value == null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return V_0 + &quot;null&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (IsSimpleType(value.GetType()))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (value is DateTime)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTime V_2 = (DateTime)value;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string.Concat(new object[] { &quot;new Date(&quot;, V_2.Year, &quot;,&quot;, V_2.Month, &quot;,&quot;, V_2.Day, &quot;,&quot;, V_2.Hour, &quot;,&quot;, V_2.Minute, &quot;,&quot;, V_2.Second, &quot;)&quot; });<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((value is string) || value.GetType().IsEnum)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string V_3 = value.ToString();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V_3 = V_3.Replace(&quot;\&quot;&quot;, &quot;&quot;&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &quot;\&quot;&quot; + AjaxUtil.convert2unicode(V_3, true) + &quot;\&quot;.replace(/&quot;/g, '\&quot;')&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (value is bool)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return value.ToString().ToLower();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &quot;&quot; + value;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars.Add(value, V_1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (value is IDictionary)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V_0 = handlerMap(V_1, value);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (value is ICollection)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V_0 = handlerCollection(V_1, value);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (value.GetType().IsArray)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V_0 = handlerArray(V_1, value);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V_0 = handlerObject(V_1, value);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return V_0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>核心源码请访问<a href="http://www.xiangyu2099.cn" target="_blank">http://www.xiangyu2099.cn</a>