ASP.NET MVC @Helper辅助方法和@functons自定义函数的使用方法
asp.net razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的切换,大大提升了我们的开发效率。但是razor语法还是有一些棉花糖值得我们了解一下,可以更加强劲的提升我们的开发效率,减少开发bug的出现。
razor 采用的是@尾巴符号,正是这个符号成就了mvc开发效率的提升。下面了解一下和@相关的两个可以重用的helper、functions。
作为现代化的程序员,我们尽可能的遵守一个原则.不要重复你自己。所以能够重构的代码我们都会合并,但是这是对于后台代码c#来说的,对于在view层 也可以进行一些简单的业务逻辑,当然view层可以进行复杂的业务逻辑判断,但是前辈说复杂的业务逻辑是model或controller的工作,view层的任务就是展示,业务逻辑应当是越少越好。
在view层进行的一些重构有哪些呢?其中一个就是@helper 自定义片段。
比如说我们要输出一个数字,如果为0的话就输出不存在,如果为其他数字就输出存在,当然这个在强大的razor语法下很容易的就可以搞定。
@(viewbag.isenabled == "0" ? "不存在" : "存在")
但是如果当前页面有很多这样的相同逻辑的判断会怎么样呢?聪明的程序员肯定知道不能重复你自己的原则,所以我们就要进行重构,但是在view层怎么进行重构呢?使用@helper可以解决这个问题。
@helper show(int count) { if (count == 0) { @:存在 } else { @:不存在 } } @(viewbag.isenabled == 0 ? "不存在" : "存在")
@show(0) @*调用helper*@
这样我们在当前页面多个位置进行调用来输出,如果要修改可以修改一部分,而不至于全部都要修改。
还有就要说了,我要在其他页面也使用这个helper怎么办呢?当然办法还是有的,在app_code文件夹下添加一个视图文件(假定为uihelper.cshtml),将helper代码复制,然后在需要调用的view页面通过@uihelper.show(0) 来调用。因为app_code文件夹下的文件最终会被编译成类。
总结:我们总结一下要实现根据不同情况进行输出有多少种实现方式,当然我能想到的不会完全。
1.通过helper进行全局的设置,让所有需要判断的页面都调用这个helper方法。
2.在后台代码判断,然后输出到前台view。
3.通过html.action()或html.partial()来获取,当然如果简单的还是采用helper,复杂的可以采用这种方式。
4.通过自定义函数functions来实现。
自定义函数@functions ,自定义函数式采用c#的语法来实现的代码复用,只不过这个函数可以将html标签输出到页面。
//自定义函数@functions @functions{ public ihtmlstring get(int count) { string result = ""; if (count == 0) { result = "不存在"; } else { result = "存在"; } return new htmlstring(result); } } @get(0) //调用的自定义函数
请注意,@functions 对应的是razor的代码段,需要添加{},并且functions内部是正规的c#方法。
如果要在多个页面同时使用这个functions,可以将这个方法移植到app_code中,假定文件名为uihelper.cshtml。并且里面的方法必须定义为静态的。这个很好理解,uihelper相当于类名,而其中的functions就相当于方法,如果要通过类名.方法名来进行调用,则必须将方法定义成静态的。
uihelper.cshtml文件代码
@helper showunit(int count) { if (count == 0) { @:免费 } else { @count } } @functions { public static ihtmlstring check(int count) { string result = ""; if (count == 0) { result = "fsdfsdfsdfd"; } else { result = count.tostring(); } return new htmlstring(result); } } //自定义函数@functions @functions{ public static ihtmlstring get(int count) { string result = ""; if (count == 0) { result = "不存在"; } else { result = "存在"; } return new htmlstring(result); } }
总结:helper针对的是直接输出html内容并且具有简单的逻辑的情况,并且helper没有任何返回值,而functions自定义函数则要强大很多,如果functions需要返回html内容,那么返回值是ihtmlstring类型,如果不需要返回值,则可以设置为void,但是如果没有返回值也就失去了定义function的意义,所以一般返回值均为ihtmlstring。对于view层的重构,我们可以采用helper和自定义函数functions的方式来实现。
补充:当在页面中引入新类型的时候,可能命名空间很长,导致页面间好多重复代码,可以在view页面的开始位置导入命名空间,
如下:@model ienumrable<mvc.test.animal>可以改为
@using mvc.test
@model ienumrable<animal>;
当所有view页面都会引入相同的命名空间的时候,可以采取一种方式避免每个页面都要用@using来引入,在views目录下有web.config文档,可以在此文档下的
<system.web.webpages.razor>区段加入每个页面都会用到的命名空间,如下:
<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>