ASP.NET MVC @Helper辅助方法和@functons自定义函数的使用方法

 更新时间:2016年04月06日 10:07:22   作者:baidixing  
本文主要介绍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>

相关文章

  • 通用 HTTP 签名组件的另类实现方式

    通用 HTTP 签名组件的另类实现方式

    这篇文章主要介绍了通用 HTTP 签名组件的另类实现方式,实现思路大概是采用链式调用的方式,使得签名的步骤可以动态拼凑组合,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • .NET实现微信公共平台上传下载多媒体文件

    .NET实现微信公共平台上传下载多媒体文件

    这篇文章主要介绍了.NET实现微信公共平台上传下载多媒体文件的相关资料,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • 动态代理的5模式使用示例和Mixin模式

    动态代理的5模式使用示例和Mixin模式

    什么叫"动态代理",代理模式我们都知道,动态代理就是动态生成的代理(采用Emit)。5种代理模式:ClassProxy、ClassProxyWithTarget、InterfaceProxyWithoutTarget、InterfaceProxyWithTarget、InterfaceProxyWithTargetInterface、Mixin模式
    2013-11-11
  • 用javascript打造搜索工具栏

    用javascript打造搜索工具栏

    用javascript打造搜索工具栏...
    2006-09-09
  • ASP.NET MVC4 HtmlHelper扩展类,实现分页功能

    ASP.NET MVC4 HtmlHelper扩展类,实现分页功能

    本文主要做了一个HtmHelper类的分页扩展函数,方便在视图中调用,有需要的朋友可以参考一下,希望对大家有所帮助。
    2016-03-03
  • .NET反向代理组件YARP介绍

    .NET反向代理组件YARP介绍

    Yarp是微软团队开发的一个反向代理组件,除了常规的http和https转换通讯,它最大的特点是可定制化,很容易根据特定场景开发出需要的定制代理通道。这篇文章介绍了.NET的反向代理组件YARP,对大家的学习或者工作具有一定的参考价值,下面随着小编来一起学习学习吧
    2022-09-09
  • ASP.NET Core中的对象池介绍

    ASP.NET Core中的对象池介绍

    这篇文章介绍了ASP.NET Core中的对象池,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • asp.net CheckBoxList各项最小宽度CSS样式(兼容性good)

    asp.net CheckBoxList各项最小宽度CSS样式(兼容性good)

    ASP.NET中,CheckBoxList里的选择都是自动宽度的,属性时没有设置各项宽度的设置,在IE10、遨游4极速模式及兼容模式下均可正确显示最小宽度,此样式除了用于CheckBoxList外,也可用于DIV等
    2013-04-04
  • ASP.NET Core设置Ocelot网关限流

    ASP.NET Core设置Ocelot网关限流

    这篇文章介绍了ASP.NET Core设置Ocelot网关限流的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • ASP.NET中弹出消息框的几种常见方法

    ASP.NET中弹出消息框的几种常见方法

    这篇文章主要介绍了ASP.NET中弹出消息框的几种常见方法,给出了几种常见的弹出消息框的方法,并总结对比了几种方法的特点,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-11-11

最新评论