ASP.NET MVC---自定义HtmlHelper方法
HtmlHelper方法是ASP.NET MVC中非常强大的特性,有了这个特性,我们就能更加随心所欲的定制自己的页面。
自定义自己的HtmlHelper方法通常有三种, 像是:
一.Razor语法
采用Razor的方式非常直观,像是这样:

- @model IEnumerable<MusicShop.Models.Album>
- @{
- ViewBag.Title = "Index";
- }
- @helper Truncate(string input, int length)
- {
- if (input.Length <= length)
- {
- @input;
- }
- else
- {
- @input.Substring(, length)<text>...</text>;
- }
- }
- <h2>Index</h2>
- <p>
- @Html.ActionLink("Create New", "Create")
- </p>
- <table>
- <tr>
- <th>
- Genre
- </th>
- <th>
- Artist
- </th>
- <th>
- Title
- </th>
- <th>
- Price
- </th>
- <th>
- AlbumArtUrl
- </th>
- <th></th>
- </tr>
- @foreach (var item in Model) {
- <tr>
- <td>
- @Html.DisplayFor(modelItem => item.Genre.Name)
- </td>
- <td>
- @Truncate(item.Artist.Name, );
- </td>
- <td>
- @Truncate(item.Title, );
- </td>
- <td>
- @Html.DisplayFor(modelItem => item.Price)
- </td>
- <td>
- @Html.DisplayFor(modelItem => item.AlbumArtUrl)
- </td>
- <td>
- @Html.ActionLink("Edit", "Edit", new { id=item.AlbumId }) |
- @Html.ActionLink("Details", "Details", new { id=item.AlbumId }) |
- @Html.ActionLink("Delete", "Delete", new { id=item.AlbumId })
- </td>
- </tr>
- }
- </table>

@helper提示编译器,这是一个辅助方法,我们可以采用@+MethodName的方法来使用该辅助方法。
当然,在Web编程中,内联是一种不好的方式,因为它们会使得页面的加载变慢,尤其是页面的反复加载。更加常用的方式就是我们在一个命名空间里定义一个辅助方法,然后在页面中引入该辅助方法,这样页面就无需承担方法源码的加载负担。
二.扩展方法
采用这样的方式,我们通常需要新建一个文件夹,专门存放我们自定义的辅助方法(很多时候,我们自定义的辅助方法可能很多,但像是Controller,Models这样的文件夹并不适合存放这些方法),其实也就是专门为辅助方法建立一个新的命名空间。
像是这样:

- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web.Mvc;
- namespace MusicShop.Helpers
- {
- public static class HtmlHelpers
- {
- public static string Truncate(this HtmlHelper helper, string input, int length)
- {
- if (input.Length <= length)
- {
- return input;
- }
- else
- {
- return input.Substring(, length) + "...";
- }
- }
- }
- }

然后我们的页面添加以下的代码:

- @model IEnumerable<MusicShop.Models.Album>
- @{
- ViewBag.Title = "Index";
- }
- @using MusicShop.Helpers
- <h2>Index</h2>
- <p>
- @Html.ActionLink("Create New", "Create")
- </p>
- <table>
- <tr>
- <th>
- Genre
- </th>
- <th>
- Artist
- </th>
- <th>
- Title
- </th>
- <th>
- Price
- </th>
- <th>
- AlbumArtUrl
- </th>
- <th></th>
- </tr>
- @foreach (var item in Model) {
- <tr>
- <td>
- @Html.DisplayFor(modelItem => item.Genre.Name)
- </td>
- <td>
- @Html.Truncate(item.Artist.Name, );
- </td>
- <td>
- @Html.Truncate(item.Title, );
- </td>
- <td>
- @Html.DisplayFor(modelItem => item.Price)
- </td>
- <td>
- @Html.DisplayFor(modelItem => item.AlbumArtUrl)
- </td>
- <td>
- @Html.ActionLink("Edit", "Edit", new { id=item.AlbumId }) |
- @Html.ActionLink("Details", "Details", new { id=item.AlbumId }) |
- @Html.ActionLink("Delete", "Delete", new { id=item.AlbumId })
- </td>
- </tr>
- }
- </table>

@using是必须的,引入辅助方法所在的命名空间。对于辅助方法的处理可以看到,我们是将其当成HtmlHelper的扩展方法使用。扩展方法的使用,使得原本非常复杂的MVC设计也能具有良好的可读性,而且灵活度和复用性非常高。我刚学C#的时候,曾经对扩展方法并不是特别感冒,因为它的使用很容易"污染"被扩展类型的命名空间,使得我们在查找该类型方法的时候非常烦。但是在使用MVC的时候,尤其是HtmlHelper方法的时候,扩展方法给了我很大的震惊:如果没有扩展方法,整个代码的可读性真的很可怕!这时我想起来C#的设计理念:读着写代码。是的,使用扩展方法,我们的代码可以像是完整的句子一样被别人阅读而不会在某个艰涩的地方戛然而止。
当然,滥用语法糖是一种危险的行为,毕竟扩展方法依然存在我刚才说的毛病,尤其是考虑软件的后续发展,我们就会惊出一身冷汗:如果将来某个类型添加一个与我的扩展方法一样的方法,那么,我的代码就会出错。
所以,我们需要一种更加安全的方法。
三.Razor view
我们可以新建一个cshtml,像是下面这样:

- @helper TruncateString(string input, int length)
- {
- if (input.Length <= length) {
- @input
- } else {
- @input.Substring(, length)<text>...</text>
- }
- }

然后就是我们的页面:

- @model IEnumerable<MusicShop.Models.Album>
- @{
- ViewBag.Title = "Index";
- }
- <h2>Index</h2>
- <p>
- @Html.ActionLink("Create New", "Create")
- </p>
- <table>
- <tr>
- <th>
- Genre
- </th>
- <th>
- Artist
- </th>
- <th>
- Title
- </th>
- <th>
- Price
- </th>
- <th>
- AlbumArtUrl
- </th>
- <th></th>
- </tr>
- @foreach (var item in Model) {
- <tr>
- <td>
- @Html.DisplayFor(modelItem => item.Genre.Name)
- </td>
- <td>
- @Helpers.Truncate(item.Artist.Name, );
- </td>
- <td>
- @Helpers.Truncate(item.Title, );
- </td>
- <td>
- @Html.DisplayFor(modelItem => item.Price)
- </td>
- <td>
- @Html.DisplayFor(modelItem => item.AlbumArtUrl)
- </td>
- <td>
- @Html.ActionLink("Edit", "Edit", new { id=item.AlbumId }) |
- @Html.ActionLink("Details", "Details", new { id=item.AlbumId }) |
- @Html.ActionLink("Delete", "Delete", new { id=item.AlbumId })
- </td>
- </tr>
- }
- </table>

使用这种方法,就没有Razor语法的内联,也没有扩展方法的后顾之忧,而且我们还可以自由的添加新的自定义方法,但是,注意,Helpers.cshtml必须放在App_Code里面。
ASP.NET MVC---自定义HtmlHelper方法的更多相关文章
- asp.net mvc 自定义pager封装与优化
asp.net mvc 自定义pager封装与优化 Intro 之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自 ...
- ASP.NET MVC 自定义路由中几个需要注意的小细节
本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...
- Asp.net Mvc 自定义Session (二)
在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...
- Asp.net mvc 自定义全局的错误事件HandleErrorAttribute无效
Asp.net mvc 自定义全局的错误事件HandleErrorAttribute,结果无效, 原因: 1.没有在RegisterGlobalFilters 里面添加或者你要的位置添加. 2.你把这 ...
- Asp.net mvc 中Action 方法的执行(一)
[toc] 在 Aps.net mvc 应用中对请求的处理最终都是转换为对某个 Controller 中的某个 Action 方法的调用,因此,要对一个请求进行处理,第一步,需要根据请求解析出对应的 ...
- ASP.NET MVC 自定义Razor视图WorkContext
概述 1.在ASP.NET MVC项目开发的过程中,我们经常需要在cshtml的视图层输出一些公用信息 比如:页面Title.服务器日期时间.页面关键字.关键字描述.系统版本号.资源版本号等 2.普通 ...
- asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值
asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...
- ASP.NET MVC自定义验证Authorize Attribute(包含cookie helper)
前几天Insus.NET有在数据库实现过对某一字段进行加密码与解密<使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和 ...
- 转:自定义ASP.NET MVC Html辅助方法
在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明.有时候,我们不想重复地写一些HTML代码,或者MS没有提供我们想要的那个HTML标签的Html辅助方法,那么 ...
- 【MVC】自定义ASP.NET MVC Html辅助方法
在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明.有时候,我们不想重复地写一些HTML代码,或者MS没有提供我们想要的那个HTML标签的Html辅助方法,那么 ...
随机推荐
- centos装openoffice
一.安装openOffice1.使用tar -xzvf OOo_3.2.0_LinuxIntel_install_wJRE_en-US.tar.gz解压缩后,会得到OOO320_m12_native_ ...
- Django:之BBS项目
首先新建一个BBSProject项目,在建一个app,把app导入到项目中. 在项目BBSProject中的settings.py中, INSTALLED_APPS = [ 'django.contr ...
- Git 删除文件
在Git中,删除也是一种修改的操作,我们验证一下,先在工作目录中添加一个新文件test.txt,并且提交: $ git statusOn branch masterUntracked files: ...
- maven 国内镜像地址
由于连接国外网站时网速特慢,为解决这个问题,os china 建立了一个maven 的私服.为了记忆,特将此记录. settings.xml 设置镜像方法步骤如下: 1. mirrors 设置 < ...
- centos配置samba
一.samba服务器的安装与配置 [root@localhost ~]# yum -y install samba samba-common samba-client samba服务器所 ...
- 今天修改 wifi hal 的时候碰见一个问题
今天修改 supplicant_name的时候出现一个问题. 发现原来init.wifi.rc 的server的时候出现了一个问题. 名字不对,没有和 supplicant_name对应起来. 所以就 ...
- 【转】Git代码行统计命令集
http://blog.csdn.NET/dwarven/article/details/46550117 http://blog.csdn.net/hshl1214/article/details/ ...
- 初识Ubuntu
刚刚装好bantu 16.10就遇到了好多问题,记录一下 一.卸载一些用不到的软件. 1.su认证失败 sudo passwd //输入命令,然后修改密码即可 2.卸载libreoffice sudo ...
- div.2/D. As Fast As Possible<数学题,二分>
题目连接 题意: n个学生出去玩,要前进一段距离,租了一辆可以载k个人的车,问到达到目的地的最短时间. cin: n,l,v1,v2,k. £:所有人一起到达终点的时候时间最短. £:所有人走路和坐车 ...
- display:block;inline;inline-block大总结
总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通 ...