日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

简单干净的C#方法设计案例:SFCUI.AjaxLoadPage()之二

發(fā)布時間:2025/3/21 C# 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单干净的C#方法设计案例:SFCUI.AjaxLoadPage()之二 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

合并顯而易見的代碼

所謂顯而易見的代碼,就是看上去和別處相同的代碼。

在這個例子中,就是View‘中初始頁面顯示的內(nèi)容與未來刷新的內(nèi)容重復(fù);Controller中初始顯示的運(yùn)算和刷新的相同。

Controller好辦,如此:

  • print?private?void?PrepareAssignItemsData(int?sprintID)???
  • {???
  • ????var?sprint?=?...???
  • ????var?team?=?...???
  • ????var?overTimes?=?...;???
  • ????var?itemsTreeInSprint?=?...???
  • ????ViewBag.AssignItemsViewModel?=?...???
  • ???
  • ????ViewBag.ViewModel?=?...???
  • }???
  • public?ActionResult?AssignItems(int?sprintID)???
  • {???
  • ????PrepareAssignItemsData(sprintID);???
  • ????return?View("~/Areas/SFC/Views/Items/ItemTree.cshtml");???
  • }???
  • public?ActionResult?AjaxRefreshAssignItemsLeftPad(int?sprintID)???
  • {???
  • ????PrepareAssignItemsData(sprintID);???
  • ????return?View("~/Areas/Agile/Views/PlanningMeetings/AjaxRefreshAssignItemsLeftPad.cshtml");???
  • }???
  • 而cshtml頁面中,只需要添加一個在頁面初始化時自動刷新的函數(shù),就能把<div id = "leftpad">變成空的,由刷新頁面來填充。代碼變成:

  • [html]?view?plaincopyprint?<script?type?=?"text/javascript">???
  • ????$(document).ready(function?()?{???
  • ????????refreshLeft();???
  • ????});???
  • ????function?refreshLeft()?{???
  • ????????$("#refreshLeft").click();???
  • ????};???
  • </script>???
  • <div?style?=?"display:?no1ne">???
  • ????@SFCUI.Link("refresh",?"/Agile/PlanningMeetings/AjaxRefreshAssignItemsLeftPad?sprintID="?+?assignItemsViewModel.Sprint.ID,?ajaxUpdateTargetID:?"leftpad",?ajaxOnSuccess:?"refreshAll",?id:?"refreshLeft")???
  • </div>???
  • ???
  • <div?id?=?"leftpad">???
  • </div>???
  • $(document).ready是多出來的代碼,負(fù)責(zé)第一次初始化時填充<div id = "leftpad>的內(nèi)容。

    封裝多余的技術(shù)代碼

    何為多余的技術(shù)代碼?之前在AjaxValue系列中曾經(jīng)提到過接口封裝的兩個原則:

    最小信息原則:方法接口應(yīng)只傳遞最必須的業(yè)務(wù)信息。

    包括兩個層面:

    1. 技術(shù)數(shù)據(jù)不要傳遞

    2. 業(yè)務(wù)數(shù)據(jù)不能重復(fù)

    ?

    現(xiàn)在,先從業(yè)務(wù)角度分析,這個函數(shù)接口設(shè)計(jì)中,到底哪些信息是必須的;讓我們來用這一原則,把上面最后的一段cshtml代碼,變成一行代碼。

    1. 如果要刷新,應(yīng)該調(diào)用什么函數(shù)(一般是一個JS函數(shù),提供給左邊的紅框,紅框運(yùn)行成功,就調(diào)用這個JS函數(shù))

    2. 用于刷新頁面的Ajax Url(上述JS函數(shù)被調(diào)用后,應(yīng)該到哪個Url獲取刷新內(nèi)容)

    3. 刷新成功后,要繼續(xù)執(zhí)行什么操作(另外一個JS函數(shù),比如刷新的內(nèi)容“錯過了document.Ready”要重新套用一下——嘗試了live功能,不知道為什么無效;或者要串聯(lián)刷新多個區(qū)域,本例中沒有)

    沒了(后面還會看到一些,不過是為了別的功能)。有幾個東西是多余的:

    1. $(document).ready.....,因?yàn)槊總€AjaxPageLoad都執(zhí)行,所以是固定的,不用作為參數(shù)傳入接口。

    2. function refreshLeft() ...{ $"#refreshLeft")....,因?yàn)檫@個按鈕是多余的,并不需要人手去點(diǎn)擊,只是函數(shù)實(shí)現(xiàn)中的一個步驟而已。換言之這個按鈕叫什么都無所謂,只要ready / function / SFCUI.Link(id: ...)中出現(xiàn)的值相同就行,無需人工指定。

    3. <div id = "leftpad"></div>也是多余的!因?yàn)榧热辉谶@里寫下那一行代碼,就在代碼處LoadPage,至于Load到什么東西里邊,ID叫什么,都無所謂。

    所以,接口調(diào)用應(yīng)該是:

  • print?@SFCUI.AjaxLoadPage("/Agile/PlanningMeetings/AjaxRefreshAssignItemsLeftPad?sprintID="?+?assignItemsViewModel.Sprint.ID,?refreshFunction:?"refreshLeft",?ajaxOnSuccess:?"refreshAll")???
  • 這句話是一個helper,將負(fù)責(zé)生產(chǎn)前面代碼中提到的<script>及其中的兩個函數(shù)ready和refreshLeft、中間的<div>@SFCUI.Link中的Ajax調(diào)用</div>、最后的<div id = "leftpad">

    下面是Helper的源代碼,里邊多了一些參數(shù),最后解釋:

  • print?public?const?string?AJAX_LOAD_PAGE_CLASS?=?"ajaxloadpage";???
  • private?static?Random?_rand?=?new?Random();???
  • public?static?MvcHtmlString?AjaxLoadPage(string?pageLink,?string?refreshFunction?=?null,?string?ajaxOnSuccess?=?null,?string?style?=?null,?int?timeout?=?0)???
  • {???
  • ????int?id?=?_rand.Next();???
  • ????string?html?=?SFCUI.Link("refresh",?"/SFC/Ajax/AjaxLoadPage?pageLink="?+?HttpUtility.UrlEncode(pageLink),?ajaxUpdateTargetID:?id.ToString()?+?"Body",?ajaxOnSuccess:?ajaxOnSuccess,?cssClass:?"hide?"?+?AJAX_LOAD_PAGE_CLASS?+?"?",?id:?id.ToString()).ToString();???
  • ????TagBuilder?script?=?new?TagBuilder("script");???
  • ????script.MergeAttribute("type",?"text/javascript");???
  • ????script.InnerHtml?=?"$(document).ready(function?()?{?setTimeout(function?()?{??$(\"#"?+?id.ToString()?+?"\").click();?},?"?+?timeout?+?");?});";???
  • ????if?(refreshFunction?!=?null)???
  • ????????script.InnerHtml?+=?"function?"?+?refreshFunction?+?"()?{?$(\"#"?+?id.ToString()?+?"\").click();?};";???
  • ????html?+=?script.ToString();???
  • ????TagBuilder?pageContainer?=?new?TagBuilder("div");???
  • ????pageContainer.MergeAttribute("id",?id.ToString()?+?"Body");???
  • ????pageContainer.MergeAttribute("style",?style);???
  • ????html?+=?pageContainer.ToString();???
  • ????return?new?MvcHtmlString(html);???
  • }???
  • 1. 先看突然跳出來的int id = _rand.next()

    之前提到,我們有很多“隨便”的變量,比如那個"refreshLeft",叫什么都行,外界不關(guān)心。但是如果設(shè)為常數(shù),則如果在同一個頁面上放兩個LoadPage的時候,會打架,所以用個Random生成ID。為什么用static 的呢?因?yàn)镽andom的生成機(jī)制,是利用調(diào)用時的系統(tǒng)時間作為“種子”,從種子產(chǎn)生下一個隨機(jī)數(shù)。如果調(diào)用時間間隔為“0”,就會產(chǎn)生出相同的種子進(jìn)而相同的隨機(jī)數(shù)。static就沒有這個問題了,大家用一個,順著排。

    總之,隨機(jī)的id代替了"refreshLeft"這個本來需要傳進(jìn)來的“變量”。

    2. TagBuilder script則直接在代碼上方產(chǎn)生一段script,免去了編寫script的工作。

    為什么要判斷refreshFunction為NULL的情況呢?因?yàn)橛幸环N場景不會重復(fù)刷新。

    在我的項(xiàng)目中,菜單極其復(fù)雜,產(chǎn)生菜單的時間,甚至比頁面本身都長。但我們也不像犧牲強(qiáng)大的菜單換取性能,怎么辦呢?子菜單延時產(chǎn)生!

    由于人們在頁面出現(xiàn)后的1~5秒內(nèi)都不會操作菜單(要離開這個頁面時才會操作),所以我們設(shè)置所有繁重的子菜單都使用AjaxLoadPage加載,而且注意最后一個參數(shù)timeout,它們多數(shù)在1000毫秒后才加載,那時候頁面早就爽快地展示在用戶面前了。

    這種場景,不會有人刷新菜單了,所以就不用RefreshFunction這個參數(shù)。

    3. TagBuilder pageContainer 代替了原來最后的<div id = "leftpad">,它的id也是隨機(jī)生成的,但是由于1、2、3中保持了id的互相照應(yīng),雖然外界看不到,但是內(nèi)部卻順暢運(yùn)行。

    4. 最后多了個style,是我們加載菜單時的需要,這里就不多說了。

    尾聲

    合并顯而易見的代碼是初級程序員的基本功,也是產(chǎn)品代碼的基本要求;封裝多余的技術(shù)代碼難度較大,但是只要用心,上述提到的原則也沒有做不到的。

    為什么要費(fèi)勁封裝呢?散裝的代碼對程序員要求低,只要好好測試,功能相同,也不會出現(xiàn)缺陷,不也一樣嗎?

    在16年的IT從業(yè)中我發(fā)現(xiàn),所有最后開發(fā)面臨崩潰的軟件,很少有受到單個技術(shù)難題或缺陷困擾的,多數(shù)都百病纏身;而百病纏身的主要問題,是可維護(hù)性差;而可維護(hù)性差的主要原因,是代碼臃腫重復(fù),尤其是似重復(fù)而不重復(fù)。

    封裝后,則:

    1. 總是使用同一段代碼,易于維護(hù)。

    2. 總是重復(fù)使用,代碼的質(zhì)量有保障。

    3. 一個地方發(fā)現(xiàn)缺陷,修改代碼后可以同時避免多個地方的缺陷。

    4. 在無需深入到技術(shù)層面的時候,可以方便地在業(yè)務(wù)層面閱讀代碼。

    5. 把時間花費(fèi)在深究代碼的封裝上,比重復(fù)碼字要有趣得多。

    ……

    在之前的IT職業(yè)生涯的“危險職業(yè)”系列中有很多人提到:“我一直在做重復(fù)勞動,沒有積累,是不是很危險?怎么辦?”其實(shí)萬事萬物看似重復(fù),其實(shí)不重復(fù)。本人從事Web編程只有一年多(其中只有6個月的編程量超過總工作量的50%),Jquery上上個月剛大致弄明白,但是我相信很多Web編程很久的程序員都不會封裝這些代碼的,而是“重復(fù)地”拷貝粘貼代碼。

    所以實(shí)際上,沒有重復(fù)的工作,只有重復(fù)的工作心態(tài)。

    之后我會寫一篇關(guān)于“重復(fù)勞動中如何提高”的IT職業(yè)生涯系列文章。?



    本文轉(zhuǎn)自火星人陳勇 51CTO博客,原文鏈接:http://blog.51cto.com/cheny/1101508

    總結(jié)

    以上是生活随笔為你收集整理的简单干净的C#方法设计案例:SFCUI.AjaxLoadPage()之二的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲欧美日韩在线 | 草草草在线视频 | 日韩精品视频观看 | 少妇高潮伦 | 老司机av导航 | 久久久性色精品国产免费观看 | 久久久久久久久蜜桃 | 人人妻人人爽一区二区三区 | 国产亚洲一区二区不卡 | 91视频免费观看网站 | 欧美日日操 | 草色网 | 一区二区在线视频免费观看 | 免费黄色片子 | 亚洲美女av网站 | 五月天丁香激情 | 国产伦精品一区二区三区视频黑人 | 久久无码国产视频 | 国产无码精品一区二区 | 欧美成人一区二区视频 | 免费午夜激情 | 伦理黄色片 | 视频在线观看免费大片 | 日本中文字幕免费观看 | 五月花婷婷 | av 一区二区三区 | 中文区中文字幕免费看 | 一级做a免费视频 | 国产成人av免费 | 新红楼梦2005锦江版高清在线观看 | 猛1被调教成公厕尿便失禁网站 | 免费日本特黄 | 日日日日日日bbbbbb | 国产第二页 | 男人的天堂a在线 | 丰满少妇一区二区三区视频 | 手机午夜视频 | 九九久久精品视频 | 蜜桃在线一区二区 | 欧美黄色性 | 日本吃奶摸下激烈网站动漫 | 午夜精品美女久久久久av福利 | japanesehdxxxx | 欧美成人h | 野花成人免费视频 | 偷拍欧美亚洲 | 成人一区电影 | 91video| 成人国产精品蜜柚视频 | 青娱乐导航 | 午夜视频1000| 天堂8在线视频 | 久久久性 | 超碰97人人草 | 日韩高清一级 | 99精品视频在线 | 亚洲综合日韩精品欧美综合区 | 久久精品国产久精国产 | 韩国成年人网站 | 国产一区 在线播放 | 99久久久| 国产女人被狂躁到高潮小说 | 毛片日韩 | 又黄又爽的免费视频 | 美女福利片 | 高清二区 | 国产精品视频久久 | 韩日精品在线 | 国产精品免费久久久久 | 欧美69式性猛交 | 亚洲一区二区三区 | 中文字字幕在线中文乱码 | 国产在线观看av | 中文字幕高清在线观看 | 91中文字幕网 | 久久视频免费在线观看 | av集中营 | 好吊色视频一区二区三区 | 在线免费观看一区二区三区 | 精品久久伊人 | 91精品国产入口 | 91黄色免费版 | 山村大伦淫第1部分阅读小说 | 福利资源在线 | 久久久久国产精品视频 | 日韩深夜福利 | japan高清日本乱xxxxx | 美女一级| 香蕉久久国产av一区二区 | 少妇人妻一区二区 | 国产精品视频一二三 | 欧美手机看片 | 久久精品国产亚洲av麻豆图片 | 婷婷亚洲五月 | 亚洲国产精品va在线 | 亚洲伊人天堂 | 少妇真人直播免费视频 | 91免费观看入口 | 久操福利视频 |