最近又是验收又是投标空余时间太少,放缓了一些学习的脚步,争取本周能重回每日的MVC学习。终于脱离MVC的基础学习和基础平台的框架设计,开始了MVC的一个实际的开发过程。开始总是最困难的,我选择了一个关联最少的系统菜单节点维护功能做MVC的第一次尝试,却还是没有预料到其困难程度以及对一些知识的准备。对比之前从微软的传统的Postback模式转到2.0的Callback模式,本次的变化更为明显很多基于DotNet的一些经验都无法复用,当然这里也有对DotNet3.0的基础知识的了解不足的因素。问题总是存在的,就在克服困难中加强对MVC的认识和理解。
第一步工作,Controller、Action、View、Model的建立,首先确定该节点在设计中的开发菜单下,而系统根据菜单层级设计Controller,先建立开发管理的Controller;其次,在系统菜单节点功能中主要包括3项工作:初始化界面、保存节点、删除节点,考虑菜单节点由动态加载模式进行,增加一个提取树节点的工作,因此完成4个Action的建设,其中预计的是初始化为返回View,保存、删除为提交form,loadtreeview为返回Json;View为一个,考虑是否将节点详细信息做为一个Partial View,但最初还是作为一个整体的功能界面操作;Model在以往的系统中使用仅仅是作为一个类使用,因此在最初接触MVC架构时,并不理解为什么说Controller和View都是表现层,Model为逻辑层及数据库处理层,在实际学习和使用Linq后,确实对Model的逻辑处理和数据库处理有了一定的认识,Model由Linq自动生成的整个库的Model。基本的工作就完成了,当然这里Model的处理实际在操作时是最后来补充的,业务功能的操作及表现逻辑的处理可以不太依赖Model。界面的设计初步如下:

第二步开始动手了,建立View,一开始就遇到了问题就是TreeView的使用,由于现在MVC的方式彻底使原来的DotNet服务器控件无法使用,TreeView如何实现变成了一个具体的问题。最初考虑用以前Callback的方式,在服务器端生成TreeView,然后输出成Html字符串,写在View中,但这种方式在交互中实现难以运用。在最终选择了YUI的TreeView作为解决方法在MVC中实现树功能。最终YUI基本满足了我对树的要求,仅有一点始终无法实现,就是对如何禁止对树的操作,这点始终无法实现,只有采用一种变通的方式来控制树的使用。
第三步进行节点信息的回传,一开始采用了Model Binder,出现了几个问题,其中对于CheckBox、CheckBoxList这类型的控件,我没有找到相关方法来进行自动的获取,当然可以采用一种变通的方式来实现(加个隐藏控件,加个事件就好了);另一个问题就是对于我form回传后,如何还原到当前状态,很难处理,最终还是采用jQuery用移步传输的方式来实现的数据提交。这里提出一点疑问,Model Binder方式很好,能有效的减轻代码量,但Post的方式以及ActionResult的返回很难形成一个较好的用户操作方式,因此Model Binder的应用场景到底在那里,我可以想象的一个应用场景就是,将维护的Form做一个单独的showdialog的方式来处理数据维护的场景,应用应该是比较方便的,但在一个页面存在多交互时很难使用这种方式,也许我没有找到合适方法。此外我也考虑了是否能使用Partial View来处理这部分提交,但没有把握好如何处理TreeView的同步控制和操作,因此就还是没有使用。
第四步的信息保存倒是变成了最简单的一步操作了,唯一麻烦的就是生成一个节点编码要进行计算的时候,在进行数据交互的时候遇到个很怪的情况,也许是我对Linq的了解不熟造成的。获取父节点下最大子节点编号,中间做了个字符串截取和转INT处理。
var maxPower = from tspn in db.tbSysPageNode
where tspn.PowerParentStr==tbsyspagenode.PowerParentStr
select Convert.ToInt16(maxPower.Max(p => p.PowerStr.Substring(p.PowerStr.Length - 2)));
以上方式,始终获取的字符串有问题。最后不的其解,将其语句分离后,采用如下语句成功获取的最大值。
var maxPower = from tspn in db.tbSysPageNode
where tspn.PowerParentStr==tbsyspagenode.PowerParentStr
select tspn;
var maxPowerStr = Convert.ToInt16(maxPower.Max(p => p.PowerStr.Substring(p.PowerStr.Length - 2)));
现在基本完成了功能初步实现,在这段时间对比原来的开发方式,最开始,最期待的几个技术要点,但在应用时并没有想象的那么好用,Controller集合了Page的Codebehind,究竟比原来的好在那里;大量交互还需要用应用Ajax技术,在原来的平台下,采用微软的Callback大部分的控件可以非常灵活的转换为Html输出到页面,但现在可能更多的要使用一些基础的Html控件来完成交互,在代码的编制上似乎没有形成大量的简化。但约定的机制确实给予我很大的启示,可以根据其约定,形成建设一个部分的代码生成工具,来完成大量Ajax应用中的JavaScript的get和set操作。希望能随着进一步的了解MVC能更好了发挥框架的优势。
题外话,在使用json来做Ajax交互的时候,在最初学习MVC的时候从赵劼的视频中认识了jquery,但在使用过程中,发现jquery在处理json数据序列化传回服务器时难以实现,最后还是在用的微软Ajax做的序列化实现的Json数据的Callback。不知不觉写了一大堆东西太凌乱,回头再总结总结。
浙公网安备 33010602011771号