ASP.NET MVC @Helper輔助方法和@functons自定義函數(shù)的使用方法
ASP.NET Razor 視圖具有.cshtml后綴,可以輕松的實(shí)現(xiàn)c#代碼和html標(biāo)簽的切換,大大提升了我們的開(kāi)發(fā)效率。但是Razor語(yǔ)法還是有一些棉花糖值得我們了解一下,可以更加強(qiáng)勁的提升我們的開(kāi)發(fā)效率,減少開(kāi)發(fā)bug的出現(xiàn)。
Razor 采用的是@尾巴符號(hào),正是這個(gè)符號(hào)成就了MVC開(kāi)發(fā)效率的提升。下面了解一下和@相關(guān)的兩個(gè)可以重用的helper、functions。
作為現(xiàn)代化的程序員,我們盡可能的遵守一個(gè)原則.不要重復(fù)你自己。所以能夠重構(gòu)的代碼我們都會(huì)合并,但是這是對(duì)于后臺(tái)代碼C#來(lái)說(shuō)的,對(duì)于在View層 也可以進(jìn)行一些簡(jiǎn)單的業(yè)務(wù)邏輯,當(dāng)然View層可以進(jìn)行復(fù)雜的業(yè)務(wù)邏輯判斷,但是前輩說(shuō)復(fù)雜的業(yè)務(wù)邏輯是Model或Controller的工作,View層的任務(wù)就是展示,業(yè)務(wù)邏輯應(yīng)當(dāng)是越少越好。
在View層進(jìn)行的一些重構(gòu)有哪些呢?其中一個(gè)就是@helper 自定義片段。
比如說(shuō)我們要輸出一個(gè)數(shù)字,如果為0的話(huà)就輸出不存在,如果為其他數(shù)字就輸出存在,當(dāng)然這個(gè)在強(qiáng)大的Razor語(yǔ)法下很容易的就可以搞定。
@(ViewBag.IsEnabled == "0" ? "不存在" : "存在")
但是如果當(dāng)前頁(yè)面有很多這樣的相同邏輯的判斷會(huì)怎么樣呢?聰明的程序員肯定知道不能重復(fù)你自己的原則,所以我們就要進(jìn)行重構(gòu),但是在View層怎么進(jìn)行重構(gòu)呢?使用@helper可以解決這個(gè)問(wèn)題。
@helper Show(int count) { if (count == 0) { @:存在 } else { @:不存在 } } @(ViewBag.IsEnabled == 0 ? "不存在" : "存在")
@Show(0) @*調(diào)用helper*@
這樣我們?cè)诋?dāng)前頁(yè)面多個(gè)位置進(jìn)行調(diào)用來(lái)輸出,如果要修改可以修改一部分,而不至于全部都要修改。
還有就要說(shuō)了,我要在其他頁(yè)面也使用這個(gè)helper怎么辦呢?當(dāng)然辦法還是有的,在app_code文件夾下添加一個(gè)視圖文件(假定為UIHelper.cshtml),將helper代碼復(fù)制,然后在需要調(diào)用的View頁(yè)面通過(guò)@UIHelper.Show(0) 來(lái)調(diào)用。因?yàn)閍pp_code文件夾下的文件最終會(huì)被編譯成類(lèi)。
總結(jié):我們總結(jié)一下要實(shí)現(xiàn)根據(jù)不同情況進(jìn)行輸出有多少種實(shí)現(xiàn)方式,當(dāng)然我能想到的不會(huì)完全。
1.通過(guò)helper進(jìn)行全局的設(shè)置,讓所有需要判斷的頁(yè)面都調(diào)用這個(gè)helper方法。
2.在后臺(tái)代碼判斷,然后輸出到前臺(tái)View。
3.通過(guò)Html.Action()或Html.Partial()來(lái)獲取,當(dāng)然如果簡(jiǎn)單的還是采用helper,復(fù)雜的可以采用這種方式。
4.通過(guò)自定義函數(shù)Functions來(lái)實(shí)現(xiàn)。
自定義函數(shù)@functions ,自定義函數(shù)式采用c#的語(yǔ)法來(lái)實(shí)現(xiàn)的代碼復(fù)用,只不過(guò)這個(gè)函數(shù)可以將html標(biāo)簽輸出到頁(yè)面。
//自定義函數(shù)@functions @functions{ public IHtmlString Get(int count) { string result = ""; if (count == 0) { result = "不存在"; } else { result = "存在"; } return new HtmlString(result); } } @Get(0) //調(diào)用的自定義函數(shù)
請(qǐng)注意,@functions 對(duì)應(yīng)的是Razor的代碼段,需要添加{},并且functions內(nèi)部是正規(guī)的c#方法。
如果要在多個(gè)頁(yè)面同時(shí)使用這個(gè)functions,可以將這個(gè)方法移植到app_code中,假定文件名為UIHelper.cshtml。并且里面的方法必須定義為靜態(tài)的。這個(gè)很好理解,UIHelper相當(dāng)于類(lèi)名,而其中的functions就相當(dāng)于方法,如果要通過(guò)類(lèi)名.方法名來(lái)進(jìn)行調(diào)用,則必須將方法定義成靜態(tài)的。
UIHelper.cshtml文件代碼
@helper ShowUnit(int count) { if (count == 0) { @:免費(fèi) } else { @count } } @functions { public static IHtmlString Check(int count) { string result = ""; if (count == 0) { result = "fsdfsdfsdfd"; } else { result = count.ToString(); } return new HtmlString(result); } } //自定義函數(shù)@functions @functions{ public static IHtmlString Get(int count) { string result = ""; if (count == 0) { result = "不存在"; } else { result = "存在"; } return new HtmlString(result); } }
總結(jié):helper針對(duì)的是直接輸出html內(nèi)容并且具有簡(jiǎn)單的邏輯的情況,并且helper沒(méi)有任何返回值,而functions自定義函數(shù)則要強(qiáng)大很多,如果functions需要返回html內(nèi)容,那么返回值是IHtmlString類(lèi)型,如果不需要返回值,則可以設(shè)置為void,但是如果沒(méi)有返回值也就失去了定義function的意義,所以一般返回值均為IHtmlString。對(duì)于View層的重構(gòu),我們可以采用helper和自定義函數(shù)functions的方式來(lái)實(shí)現(xiàn)。
補(bǔ)充:當(dāng)在頁(yè)面中引入新類(lèi)型的時(shí)候,可能命名空間很長(zhǎng),導(dǎo)致頁(yè)面間好多重復(fù)代碼,可以在view頁(yè)面的開(kāi)始位置導(dǎo)入命名空間,
如下:@model IEnumrable<MVC.Test.Animal>可以改為
@using MVC.Test
@model IEnumrable<Animal>;
當(dāng)所有view頁(yè)面都會(huì)引入相同的命名空間的時(shí)候,可以采取一種方式避免每個(gè)頁(yè)面都要用@using來(lái)引入,在Views目錄下有web.config文檔,可以在此文檔下的
<system.web.webPages.razor>區(qū)段加入每個(gè)頁(yè)面都會(huì)用到的命名空間,如下:
<system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Optimization"/> <add namespace="System.Web.Routing" /> <add namespace="WebApplication1" /> </namespaces> </pages> </system.web.webPages.razor>
- 解決asp.net mvc UpdateModel更新對(duì)象后出現(xiàn)null問(wèn)題的方法
- ASP.NET MVC命名空間時(shí)引起錯(cuò)誤的解決方法
- ASP.NET MVC實(shí)現(xiàn)儀表程序
- ASP.NET Mvc開(kāi)發(fā)之EF延遲加載
- ASP.NET Mvc開(kāi)發(fā)之查詢(xún)數(shù)據(jù)
- ASP.NET Mvc開(kāi)發(fā)之刪除修改數(shù)據(jù)
- ASP.NET MVC中HtmlHelper控件7個(gè)大類(lèi)中各個(gè)控件使用詳解
- 詳解ASP.NET MVC Form表單驗(yàn)證
- ASP.NET MVC4 HtmlHelper擴(kuò)展類(lèi),實(shí)現(xiàn)分頁(yè)功能
- asp.net MVC利用自定義ModelBinder過(guò)濾關(guān)鍵字的方法(附demo源碼下載)
- ASP.NET MVC使用ActionFilterAttribute實(shí)現(xiàn)權(quán)限限制的方法(附demo源碼下載)
相關(guān)文章
IIS中ASP.NET連接SQL Server出錯(cuò)的解決方法
在IIS中運(yùn)行的ASP.NET應(yīng)用程序其所屬用戶(hù)名為ASPNET的特定用戶(hù),其默認(rèn)權(quán)限是無(wú)法訪(fǎng)問(wèn)SQL Server的,更不可能訪(fǎng)問(wèn)ASP.NET應(yīng)用程序的數(shù)據(jù)庫(kù)了,因此要在IIS中訪(fǎng)問(wèn)SQL Server就需要給ASPNET帳戶(hù)賦予相應(yīng)的權(quán)限.2010-03-03asp.net 使用ObjectDataSource控件在ASP.NET中實(shí)現(xiàn)Ajax真分頁(yè)
ASP.NET 3.5中新增加的ListView控件是一個(gè)用于頁(yè)面數(shù)據(jù)綁定和界面布局的非常棒的控件,它在ASP.NET 2.0 GridView的基礎(chǔ)上做了很多改進(jìn),用戶(hù)在使用時(shí)可以控制的元素更多,開(kāi)發(fā)時(shí)的靈活性更大了,個(gè)人覺(jué)得ListView在使用時(shí)比DataGrid和GirdView更加順手。2009-11-11C#中實(shí)現(xiàn)偽靜態(tài)頁(yè)面兩種方式介紹
偽靜態(tài)技術(shù)的誕生,帶動(dòng)了于搜索引擎友好C#中實(shí)現(xiàn)偽靜態(tài)頁(yè)面有兩種方式,本文將一一詳解,感興趣的朋友可以參考下,希望本文對(duì)你學(xué)習(xí)偽靜態(tài)有所幫助2013-01-01asp.net request.PathInfo實(shí)現(xiàn)的url重寫(xiě)
最近對(duì)在開(kāi)始研究url重寫(xiě),對(duì)重寫(xiě)的原理以及重寫(xiě)之后引起的性能問(wèn)題是研究的重點(diǎn),研究過(guò)程中發(fā)現(xiàn)了一種輕便的“url重寫(xiě)方案”2009-04-04解決asp.net core在輸出中文時(shí)亂碼的問(wèn)題
最近在學(xué)習(xí)asp.net core的時(shí)候,嘗試在控制臺(tái),或者頁(yè)面上輸出中文,會(huì)出現(xiàn)亂碼的問(wèn)題。那么這該如何解決呢?下面通過(guò)這篇文章來(lái)一起看看吧,文中給出了詳細(xì)的解決方法,相信對(duì)大家有一定的參考價(jià)值。2016-12-12asp.net中TextBox只能輸入數(shù)字的最簡(jiǎn)潔的兩種方法
這篇文章介紹了asp.net中TextBox只能輸入數(shù)字的最簡(jiǎn)潔的兩種方法,有需要的朋友可以參考一下2013-11-11在Asp.net core中實(shí)現(xiàn)websocket通信
這篇文章介紹了在Asp.net core中實(shí)現(xiàn)websocket通信的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07DotNetCore深入了解之HttpClientFactory類(lèi)詳解
這篇文章主要給大家介紹了關(guān)于DotNetCore深入了解之HttpClientFactory類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03