zoukankan      html  css  js  c++  java
  • 局部化页面和效率CMS实践系列总结

    对于重复开发,我们懒人最是厌恶了。特别是在硬件摩尔的时代。

    真的是很讨厌写很多重复函数的东西比如:

    publicclass ArticleController : Controller
    {
    //TO DO
    //C U R D 接下来还有 Channel Comment User ....
    }

    接下来还有 Channel Comment User ..

    写到你手抽筋。。。。也许你会说把repeat丢给自动生成工具。不仅有些是不必要的代码,而且还不符合DRY原则。

    但是这里我要表达的不是 Controller而是存在与 view 上的一些重复的开发。

    有时候我们会遇到这样的场景:

    添加一个文章但是需要选定他所属的栏目(外键关系)

    此时如果用我前两篇的做法就会不符合需求。

    方法一:覆盖重写 

    父类中

    [HttpGet]
    publicvirtual ActionResult Create()
    {
    return View();
    }
     

    ArticleController中

    publicclass ArticleController : AbatractAutoController
    {
    public ActionResult create()
    {
    var channelManager
    = IRR.GetRepository(typeof(Model.KF_Channel));
    ViewData[
    "ChannelList"] = channelManager.GetAll();
    return View();
    }
    }

    这样做是很简单也很没有效率的事情接下来你会面临

    需要添加一个 文章的审核者(假设又一个外键关系),与此相关联的文章(需要从数据库读出一些文章以供选择)等等。

    当然你可以打起精神来。。继续在ArticleController添加.

    此时新的需求来了:

    在一个另外 创建栏目的页面里需要重复用到 栏目列表。

    此时 我们可以 选择

    1 copy 把得到栏目列表的 方法 copy到 channelController 里面。

    2 (更好的)把得到栏目列表的方法写出函数 以供 调用。

    即使是方法2 任然 破坏了我们当初的设想 autoController 自动增删查改。

    此时我们可以用

    方法二:局部页面的方法

    在不破坏原有 controller 上,在页面采用 Html.RenderAction 方法。

    他会以请求url的方式得到一个页面并加载到当前位置。

    这样的话我们就可以把粒度细化到一个html控件上。

    <select name="需要绑定的name">
    <%
    PagerHelper.GetSelect(this,
    "Channel", "Type1");
    %>
    </select>
    //====== 面向html 控件编程
    publicstaticvoid GetSelect(ViewPage viewPage, string ModelName, string KJName)
    {
    RouteValueDictionary routeValueDictionary
    =new RouteValueDictionary();
    routeValueDictionary.Add(
    "ModelName", ModelName);
    routeValueDictionary.Add(
    "KJName", KJName);
    viewPage.Html.RenderAction(
    "GetSelect", "UserKJ", routeValueDictionary);
    }

    由于历史遗留问题(刚开始做项目的时候使用了辅助类)我这里使用的是辅助类,你也可以用自定义扩展,那么在view

    上就可以少写一个 this。各有好处吧。

    然后去后台写一个操作。

    代码
    public ActionResult GetSelect(string ModelName, string KJName)
    {
    SearchPage searchPage
    =new SearchPage();
    searchPage.ModelName
    = ModelName;
    IRepository ir
    = IRR.GetRepository(
    searchPage.ModelName.str2type());
    //根据类型得到要操作的类
    searchPage.model = searchPage.ModelName.str2type();
    var iq
    = ir.GetAll();// 得到所有
    return View("Select"+ KJName, iq);
    }

    再去到返回的view上写具体的显示

    <%var Mod= Model as IQueryable<KF_Channel>;%>
    <%foreach (var kfChannel in Mod)
    {
    %>
    <option value="<%=kfChannel.ChannelID %>">
    <%=kfChannel.ForderName %></option>
    <%
    }
    %>

    整个方法比较笨拙,

    当需求重复的时候

    方法一:破坏autocontroller 调用一个方法。在页面上添加一个 viewdata["channellist"]

    方法二:我们需要在页面上加一个

    <% PagerHelper.GetSelect(this, "Channel", "Type1");%> 必要的开销

    显示重复的时候还是可以省点力的。

    从controller得到的数据的处理 

    方法一 需要在辅助方法里面 StringBuilder 然后把html写死。类似这种

    代码
    publicstaticstring DDListByVD(List<SelectListItem> vdd, int FatherChannelID)
    {
    StringBuilder sb
    =new StringBuilder();
    foreach (SelectListItem listItem in vdd)
    {
    if (listItem.Value == FatherChannelID.ToString())
    sb.Append(
    "<option selected=\"true\" value="+ listItem.Value +" >"+ listItem.Text +"</option>");
    else
    sb.Append(
    "<option value="+ listItem.Value +" >"+ listItem.Text +"</option>");
    }
    return sb.ToString();
    }

    方法二 因为写在一个view里面跟方便前后台的分离,交给美工给大的权利(我是前台:不用每次都找后台改了。。)

    更主要的是需求更改之后 比如说 需要排序 ,字符串处理  ,甚至显示方式的改变(从下拉到 列表框)

    起码可以临时解决在页面上的尖括号中进行处理。虽然这样不符合 轻快的view的原则 ,也可以在写在辅助方法里面。

     其实对于这个我最想要的效果是这样。

    前台对于简单的下拉框要求只需要传入参数,1实体名(Articles),2过滤的条件和排序,3返回的格式和属性 key-value

    由于我使用的是Linq 2 SQL得到的只是iquery 对象,查了csdn发现不能即时查询出结果,所以无法得到指定的一个字段,

    其实按道理是可以的。但是由于我们操作的是一个父类,子类的东西用不了。遗憾啊。

    我的MVC2.0+Linq2SQL 的CMS提升开发效率的几个想法和实现的到这里算告一段落了。

     其中第一步没有写出来其实就在第一篇里面已经提到的那个对Linq封装CURD那一层的那个优化,由于都是参考

    Suteki.Shop的没有多少自己的想法,也就不写了。

    现在来梳理一下我整个的春秋痴梦:(mvc+linq2sql)CMS提升开发效率的几个想法和实践。

    整个的目的是:提高开发效率,主要是后台的开发同类新需求的效率。

    实现的办法是:做一个通用的增删查改列的前台使用入口。让实现新业务需求的代码量降到我能达到的最低。

    几乎把重复的能封装重用的都省了。所有的要写的都是必须得写的,我叫做必要开销。

    真的是一次编写,所有的实体类通用。

    当然整个的功能不是很强,也没有考虑很多性能,安全。但是实现自己的想法也确实提高了效率。

    觉得真的很爽。一个月前规划了整个的优化的计划。一个星期实现一个基本达到了。到现在也没有什么新的想法。

    下一步准备学习Silverlight。环境也装好了。教程也下载好了。项目也找好了。:)  。简单的来说就是把CMS移植

    到SL上去。

    以后我一周还是至少会发一篇随笔。坚持写下去。向老赵大哥,未鹏大哥学习,坚持原创,坚持思考。

    我的前两篇 春秋痴梦。

    第一步:接口+泛型强大的Repository

    第二步:泛型通用动态查询(LinQ+Ajax) 

    第三步:AutoController--通用自动增删查改

    第四步:局部化页面满足特殊要求

     


    作者:撞破南墙
    出处:http://www.cnblogs.com/facingwaller/
    关于作者:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    性能优化与使用Block实现数据回传(3)
    封装思想和抽取(2)
    磁盘缓存的计算与清理(1)
    滑动返回的延伸(全局滑动返回功能)
    滑动返回功能被覆盖的解决思路
    OC之类与对象
    OC之OC与C的比较
    OC之知识储备篇
    C语言之总结3
    C语言总结2
  • 原文地址:https://www.cnblogs.com/facingwaller/p/1747572.html
Copyright © 2011-2022 走看看