MVC学习系列[email protected]辅助方法和用户自定义HTML方法

在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件。HTML帮助类是在视图中,用来呈现HTML内容的。HTML帮助类是一个方法,它返回的是string类型的值。

HTML帮助类,分成三个类型:

  1. Inline HTML helpers【内联的HTML帮助类,例如@Html.Label等】
  2. Built-in HTML helpers【也就是嵌套的HTML帮助类,即@helper辅助方法】
  3. Custom HTML helpers【自定义的HTML帮助类】

在这里,我们学习第二种,和第三种,第一种太简单了,这里就不介绍了。关于第一种,我之前的文章中有介绍,大家可以看看。

  1. 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>

时间: 2024-10-06 09:48:34

MVC学习系列[email protected]辅助方法和用户自定义HTML方法的相关文章

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

ASP.NET MVC学习系列(二)-WebAPI请求(转)

转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax

MVC学习系列——ModelBinder扩展

在MVC系统中,我们接受数据,运用的是ModelBinder 的技术. MVC学习系列——ActionResult扩展在这个系列中,我们自定义了XmlResult的返回结果. 那么是不是意味着能POST一个XML数据类型给我们项目,这样的话,我们需要自定义一个XmlModelBinder来接受XML数据. 新建XmlModelBinder,继承于:IModelBinder 1 public class XmlModelBinder : IModelBinder 2 { 3 public obje

关于mysql修改密码 set password for [email&#160;protected] = password(&#39;xxx&#39;);报错解决方法

当你安装好mysql后,发现mysql -u root -p直接按俩次enter竟然不用密码就能登录进去,可是navicat连接mysql需要密码啊.怎么办? 于是我通过百度寻觅良久发现多数都是通过下面的命令修改.但是自己执行时报下面的错. mysql> set password for [email protected] = password('123456'); ERROR 1064 (42000): You have an error in your SQL syntax; check t

MVC学习系列13--验证系列之Remote Validation

大多数的开发者,可能会遇到这样的情况:当我们在创建用户之前,有必要去检查是否数据库中已经存在相同名字的用户.换句话说就是,我们要确保程序中,只有一个唯一的用户名,不能有重复的.相信大多数人都有不同的解决方法,但是ASP.NET MVC中,为我们提供了一个特性,就是Remote Validation,用它可以解决类似这样的问题. Remote Validation调用了一个Ajax请求,可以是GET或者POST方式,接着调用方法,这个方法,至少要有一个参数,并且方法的返回类型是Json格式的.[M

MVC学习系列7--下拉框的联动

[使用场景:两个DropDownList的联动,选择其中一个DropDownList,然后加载数据到另外的一个DropDownList上] 这里,我打算实现的需求是:有两个DropDownList,一个默认加载所有的省份数据,然后,当我选择省份的时候,把对应的市的数据,绑定到另外一个DropDownList上面,即实现了联动. 好了,这里不打算使用EF了,换用ADO.NET.首先新建好数据库,表: USE master GO IF EXISTS (SELECT * FROM sysdatabas

MVC学习系列14--Bundling And Minification【捆绑和压缩】--翻译国外大牛的文章

这个系列是,基础学习系列的最后一部分,这里,我打算翻译一篇国外的技术文章结束这个基础部分的学习:后面打算继续写深入学习MVC系列的文章,之所以要写博客,我个人觉得,做技术的,首先得要懂得分享,说不定你自己以为正确的东西,存在瑕疵,分享出来,大家也可以互相进步.这样整个生态圈也会越来越好.不是么?   好了,闲话扯远了,下面开始正题吧,一下是英文和中文对照,翻译的不好,请见谅. This article introduces how to improve ASP.NET MVC Applicati

MVC 学习系列

总是很难说清MVC的概念,即使读了源代码后(读的时候有些东西,理解起来还是有点吃力),也依然能难对整体的每一个具体的原理说的一清二楚.为了达到自己学习的目的,我把自己的学习路线写成文章,一边自己能对MVC有深刻的认识. 尽管也看了一些关于MVC的书籍,但还是很难分清MVP,MVVM,MVC的概念区分,先抛弃之前的概念的区分,先体验后在总结吧. MVC文章系列: 1,)mvc controller控制器

shell学习之[email&#160;protected] 与 $* 差在哪?

要说 [email protected] 与 $* 之前,需得先从 shell script 的 positional parameter 谈起... 我们都已经知道变量(variable)是如何定义及替换的,这个不用再多讲了. 但是,我们还需要知道有些变量是 shell 内定的,且其名称是我们不能随意修改的, 其中就有 positional parameter 在内.在 shell script 中,我们可用 $0, $1, $2, $3 ... 这样的变量分别提取命令行中的参数, 如ls -