MVC学习系列4--@helper辅助方法和用户自定义HTML方法
在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件。HTML帮助类是在视图中,用来呈现HTML内容的。HTML帮助类是一个方法,它返回的是string类型的值。
HTML帮助类,分成三个类型:
- Inline HTML helpers【内联的HTML帮助类,例如@Html.Label等】
- Built-in HTML helpers【也就是嵌套的HTML帮助类,即@helper辅助方法】
- Custom HTML helpers【自定义的HTML帮助类】
在这里,我们学习第二种,和第三种,第一种太简单了,这里就不介绍了。关于第一种,我之前的文章中有介绍,大家可以看看。
- Built-in HTML helpers【也就是嵌套的HTML帮助类,即@helper辅助方法】
首先新建一个空白的MVC项目,创建一个Home控制器,默认的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace HTMLHelperMVC.Controllers
{
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
return View();
}
}
}

添加对应的Index视图:在视图中写上@Helper辅助方法:

@{
Layout = null;
}
<!DOCTYPE html>
@*声明辅助方法开始*@
@helper SayHello(string[] strArray)
{
<ol>
@foreach (var item in strArray)
{
<li>Hello:@item</li>
}
</ol>
}
@*声明辅助方法结束*@
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
@*调用辅助方法*@
@SayHello(new string[] { "C#","Javascript","ASP.NET MVC","EntityFramework","WCF","WPF","......"})
</div>
</body>
</html>

接着运行Index方法,结果是:

可以看出来,@helper辅助方法,很有作用,当一个块需要多次使用的时候,就可以使用@helper辅助方法
然而,你可能看出来了,这样的写法,我只能在当前页面,重复使用这个@helper辅助方法,那如果我想在其他页面也使用呢????
我们在控制器中另外添加一个方法,并创建视图页面:

public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
return View();
} public ActionResult AnotherIndex()
{
return View();
}
}

AnotherIndex视图:

@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>AnotherIndex</title>
</head>
<body>
<div>
</div>
</body>
</html>

那么,我们现在要怎么做呢,才能在所有页面都能使用同一个@helper辅助方法呢???
这样;我们先添加一个App_Code文件夹,然后在里面新建一个视图,把刚才声明辅助方法的部分,完整不动的拷贝过去。


接着编译一下整个项目【PS:如果没有出来智能提示,就改一下,App_Code下,视图的属性,改为

,在页面中,Index视图中,这样调用:

@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
@*调用辅助方法*@
@HTMLClass.SayHello(new string[] { "C#","Javascript","ASP.NET MVC","EntityFramework","WCF","WPF","......"})
</div>
</body>
</html>

AnotherIndex视图中:

@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>AnotherIndex</title>
</head>
<body>
<div>
@HTMLClass.SayHello(new string[] { "1","2"})
</div>
</body>
</html>

结果还是一样的,现在不同的是,可以在多个页面使用同一个辅助方法了。
2.Custom HTML helpers【自定义的HTML帮助类】
现在看看第二种,也就是自定义的HTML帮助类:
我们可以创建2种方式的,自定义帮助类:
1.Using static methods【使用静态的方法】
2.Using extension methods【使用扩展方法】
首先看看,使用静态方法怎么做的。
新建一个文件夹【CustomerHelper】,在CustomerHelper下面新建一个帮助类【CustomerHelperClass】

帮助类中,我们新建一个静态的方法CreateImage:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
//MvcHtmlString需要引入命名空间
using System.Web.Mvc; namespace HTMLHelperMVC.CustomerHelper
{
public class CustomerHelperClass
{
/// <summary>
/// 静态方法,创建Image
/// </summary>
/// <param name="imageSource">图片源</param>
/// <param name="alttext">图片的alt属性值</param>
/// <param name="width">宽度</param>
/// <param name="hight">高度</param>
/// <returns></returns>
public static MvcHtmlString CreateImage(string imageSource, string altText, string width, string hight)
{
//通过TagBuilder创建img标签
TagBuilder imageTag = new TagBuilder("img");
//MergeAttribute添加新特性
imageTag.MergeAttribute("src", imageSource);
imageTag.MergeAttribute("alt", altText);
imageTag.MergeAttribute("width", width);
imageTag.MergeAttribute("hight",hight);
// MvcHtmlString.Create,使用指定的文本值,创建HTML编码的字符串
return MvcHtmlString.Create(imageTag.ToString(TagRenderMode.SelfClosing)); }
}
}

然后我们在视图中调用:

@{
Layout = null;
}
<!DOCTYPE html>
@using HTMLHelperMVC.CustomerHelper
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
@*调用辅助方法*@
@*@HTMLClass.SayHello(new string[] { "C#","Javascript","ASP.NET MVC","EntityFramework","WCF","WPF","......"})*@
@CustomerHelperClass.CreateImage("/Image/1.png","Daniel","150","150")
</div>
</body>
</html>

结果是:

可以看到静态方法,为我们创建了Image控件,上面的调用需要Using一下辅助类:
@using HTMLHelperMVC.CustomerHelper
每次都要using是不是很麻烦???
我们可以在视图的配置文件中,加上这句话:

顺便改一下配置文件的属性:

在编译一下:
之后,我们去掉视图页面中的
@using HTMLHelperMVC.CustomerHelper
得到的结果也是一样的。
再来说说,扩展方法的方式,自定义辅助HTML吧:
其实这就更简单了,无非就是扩展方法,扩展HTMLHelper类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
//MvcHtmlString需要引入命名空间
using System.Web.Mvc; namespace HTMLHelperMVC.CustomerHelper
{
public static class CustomerHelperClass
{
/// <summary>
/// 静态方法,创建Image
/// </summary>
/// <param name="imageSource">图片源</param>
/// <param name="alttext">图片的alt属性值</param>
/// <param name="width">宽度</param>
/// <param name="hight">高度</param>
/// <returns></returns>
public static MvcHtmlString CreateImage(string imageSource, string altText, string width, string hight)
{
//通过TagBuilder创建img标签
TagBuilder imageTag = new TagBuilder("img");
//MergeAttribute添加新特性
imageTag.MergeAttribute("src", imageSource);
imageTag.MergeAttribute("alt", altText);
imageTag.MergeAttribute("width", width);
imageTag.MergeAttribute("hight",hight);
// MvcHtmlString.Create,使用指定的文本值,创建HTML编码的字符串
return MvcHtmlString.Create(imageTag.ToString(TagRenderMode.SelfClosing)); } public static MvcHtmlString CreateImage(this HtmlHelper htmlHelper, string imageSource, string altText, string width, string hight)
{
//通过TagBuilder创建img标签
TagBuilder imageTag = new TagBuilder("img");
//MergeAttribute添加新特性
imageTag.MergeAttribute("src", imageSource);
imageTag.MergeAttribute("alt", altText);
imageTag.MergeAttribute("width", width);
imageTag.MergeAttribute("hight", hight);
// MvcHtmlString.Create,使用指定的文本值,创建HTML编码的字符串
return MvcHtmlString.Create(imageTag.ToString(TagRenderMode.SelfClosing)); }
}
}

视图中调用:

@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
@*调用辅助方法*@
@*@HTMLClass.SayHello(new string[] { "C#","Javascript","ASP.NET MVC","EntityFramework","WCF","WPF","......"})*@
@CustomerHelperClass.CreateImage("/Image/1.png","Daniel","150","150")
@Html.CreateImage("/Image/1.png", "Daniel", "150", "150")
</div>
</body>
</html>

结果是一样的。。

MVC学习系列4--@helper辅助方法和用户自定义HTML方法的更多相关文章
- ASP.NET MVC学习系列(二)-WebAPI请求
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
- ASP.NET MVC学习系列(二)-WebAPI请求(转)
转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...
- [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参
[转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...
- ASP.NET MVC学习系列(二)-WebAPI请求 转载https://www.cnblogs.com/babycool/p/3922738.html
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
- MVC学习系列——ModelBinder扩展
在MVC系统中,我们接受数据,运用的是ModelBinder 的技术. MVC学习系列——ActionResult扩展在这个系列中,我们自定义了XmlResult的返回结果. 那么是不是意味着能POS ...
- MVC学习系列——记一次失败面试后,感想。
在此写博客之际,热烈庆祝母校苏州科技学院,正式改名为苏州科技大学. 一晃眼,从自己投身IT行业已经两年有余,期间经历了结婚.买房等人生大事,非常感谢我的老婆,谢谢她这么爱我,嫁给我这个码农,呵呵... ...
- MVC学习系列14--Bundling And Minification【捆绑和压缩】--翻译国外大牛的文章
这个系列是,基础学习系列的最后一部分,这里,我打算翻译一篇国外的技术文章结束这个基础部分的学习:后面打算继续写深入学习MVC系列的文章,之所以要写博客,我个人觉得,做技术的,首先得要懂得分享,说不定你 ...
- Asp.net MVC 学习系列(一)序
题外话 公司本月开始提供早餐服务,2块天一餐,包括粥,两个包(听说是利口福供应的),一个鸡蛋.良心企业.公司原本有一个内部订餐系统,用Delphi开发的,开发的人早就走光了,也没有留下什么文档,现在项 ...
- MVC 学习系列
总是很难说清MVC的概念,即使读了源代码后(读的时候有些东西,理解起来还是有点吃力),也依然能难对整体的每一个具体的原理说的一清二楚.为了达到自己学习的目的,我把自己的学习路线写成文章,一边自己能对M ...
随机推荐
- 跟Unity3D学代码优化
今天我们来聊聊如何跟Unity学代码优化,准确地说,是通过学习Unity的IL2CPP技术的优化策略,应用到我们的日常逻辑开发中. 做过Unity开发的同学想必对IL2CPP都很清楚,简单地说,IL2 ...
- Git 进阶指南(git ssh keys / reset / rebase / alias / tag / submodule )
在掌握了基础的 Git 使用 之后,可能会遇到一些常见的问题.以下是猫哥筛选总结的部分常见问题,分享给各位朋友,掌握了这些问题的中的要点之后,git 进阶也就完成了,它包含以下部分: 如何修改 ori ...
- RabbitMQ基础知识
RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...
- AngularJS过滤器filter-时间日期格式-渲染日期格式-$filter
今天遇到了这些问题索性就 写篇文章吧 话不多说直接上栗子 不管任何是HTML格式还是JS格式必须要在 controller 里面写 // new Date() 获取当前时间 yyyy-MM-ddd ...
- IIS访问共享文件详解
前言 公司同事做了一个报表系统,需要做集群部署,本来是一件挺容易的事,但是部署过程中却遇到啦种种蛋疼问题. 问题1.我们的报表使用的是微软的水晶报表,需要上传报表的配置文件,然后水晶报表提供的控件来读 ...
- 【解决方案】 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userHandler': Injection of resource dependencies failed;
一个错误会浪费好多青春绳命 鉴于此,为了不让大家也走弯路,分享解决方案. [错误代码提示] StandardWrapper.Throwableorg.springframework.beans.fac ...
- JavaScript 函数节流和函数去抖应用场景辨析
概述 也是好久没更新 源码解读,看着房价蹭蹭暴涨,心里也是五味杂陈,对未来充满恐惧和迷茫 ...(敢问一句你们上岸了吗) 言归正传,今天要介绍的是 underscore 中两个重要的方法,函数节流和函 ...
- CSS教程:div垂直居中的N种方法以及多行文本垂直居中的方法
在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中 ...
- ASP.NET Core 中文文档 第一章 入门
原文:Getting Started 翻译:娄宇(Lyrics) 校对:刘怡(AlexLEWIS) 1.安装 .NET Core 2.创建一个新的 .NET Core 项目: mkdir aspnet ...
- ASP.NET Core 中文文档 第三章 原理(16).NET开放Web接口(OWIN)
原文:Open Web Interface for .NET (OWIN) 作者:Steve Smith. Rick Anderson 翻译:谢炀(kiler398) 校对:孟帅洋(书缘) ASP.N ...