博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义HtmlHelper方法
阅读量:4985 次
发布时间:2019-06-12

本文共 5257 字,大约阅读时间需要 17 分钟。

原文:http://www.cnblogs.com/wenjiang/archive/2013/03/30/2990854.html

 

HtmlHelper方法是ASP.NET MVC中非常强大的特性,有了这个特性,我们就能更加随心所欲的定制自己的页面。

       自定义自己的HtmlHelper方法通常有三种, 像是:

一.Razor语法

      采用Razor的方式非常直观,像是这样:

@model IEnumerable
@{ ViewBag.Title = "Index";}@helper Truncate(string input, int length){ if (input.Length <= length) { @input; } else { @input.Substring(0, length)
...
; }}

Index

@Html.ActionLink("Create New", "Create")

@foreach (var item in Model) {
}
Genre Artist Title Price AlbumArtUrl
@Html.DisplayFor(modelItem => item.Genre.Name) @Truncate(item.Artist.Name, 25); @Truncate(item.Title, 25); @Html.DisplayFor(modelItem => item.Price) @Html.DisplayFor(modelItem => item.AlbumArtUrl) @Html.ActionLink("Edit", "Edit", new { id=item.AlbumId }) | @Html.ActionLink("Details", "Details", new { id=item.AlbumId }) | @Html.ActionLink("Delete", "Delete", new { id=item.AlbumId })

      @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(0, length) + "...";             }        }     }}

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

@model IEnumerable
@{ ViewBag.Title = "Index";}@using MusicShop.Helpers

Index

@Html.ActionLink("Create New", "Create")

@foreach (var item in Model) {
}
Genre Artist Title Price AlbumArtUrl
@Html.DisplayFor(modelItem => item.Genre.Name) @Html.Truncate(item.Artist.Name, 25); @Html.Truncate(item.Title, 25); @Html.DisplayFor(modelItem => item.Price) @Html.DisplayFor(modelItem => item.AlbumArtUrl) @Html.ActionLink("Edit", "Edit", new { id=item.AlbumId }) | @Html.ActionLink("Details", "Details", new { id=item.AlbumId }) | @Html.ActionLink("Delete", "Delete", new { id=item.AlbumId })

      @using是必须的,引入辅助方法所在的命名空间。对于辅助方法的处理可以看到,我们是将其当成HtmlHelper的扩展方法使用。扩展方法的使用,使得原本非常复杂的MVC设计也能具有良好的可读性,而且灵活度和复用性非常高。我刚学C#的时候,曾经对扩展方法并不是特别感冒,因为它的使用很容易"污染"被扩展类型的命名空间,使得我们在查找该类型方法的时候非常烦。但是在使用MVC的时候,尤其是HtmlHelper方法的时候,扩展方法给了我很大的震惊:如果没有扩展方法,整个代码的可读性真的很可怕!这时我想起来C#的设计理念:读着写代码。是的,使用扩展方法,我们的代码可以像是完整的句子一样被别人阅读而不会在某个艰涩的地方戛然而止。

      当然,滥用语法糖是一种危险的行为,毕竟扩展方法依然存在我刚才说的毛病,尤其是考虑软件的后续发展,我们就会惊出一身冷汗:如果将来某个类型添加一个与我的扩展方法一样的方法,那么,我的代码就会出错。

      所以,我们需要一种更加安全的方法。

三.Razor view

       我们可以新建一个cshtml,像是下面这样:

@helper TruncateString(string input, int length){    if (input.Length <= length) {        @input    } else {        @input.Substring(0, length)
...
}}

       然后就是我们的页面:

@model IEnumerable
@{ ViewBag.Title = "Index";}

Index

@Html.ActionLink("Create New", "Create")

@foreach (var item in Model) {
}
Genre Artist Title Price AlbumArtUrl
@Html.DisplayFor(modelItem => item.Genre.Name) @Helpers.Truncate(item.Artist.Name, 25); @Helpers.Truncate(item.Title, 25); @Html.DisplayFor(modelItem => item.Price) @Html.DisplayFor(modelItem => item.AlbumArtUrl) @Html.ActionLink("Edit", "Edit", new { id=item.AlbumId }) | @Html.ActionLink("Details", "Details", new { id=item.AlbumId }) | @Html.ActionLink("Delete", "Delete", new { id=item.AlbumId })

        使用这种方法,就没有Razor语法的内联,也没有扩展方法的后顾之忧,而且我们还可以自由的添加新的自定义方法,但是,注意,Helpers.cshtml必须放在App_Code里面。

转载于:https://www.cnblogs.com/gyt-xtt/p/5786008.html

你可能感兴趣的文章
在博客园的第一篇文章,先简单自述一下吧
查看>>
深入了解 Dojo 的服务器推送技术
查看>>
hdu 4284 状态压缩
查看>>
逆向分析技术
查看>>
Latex
查看>>
SpringMVC处理JSON
查看>>
几何建模
查看>>
java crm 系统 进销存 springmvc SSM项目项目源码
查看>>
jQuery.extend 函数详解
查看>>
<jQuery> 一. jQuery简介及优点
查看>>
架构相关概念——学习笔记
查看>>
被称为“开发者神器”的GitHub,到底该怎么用?
查看>>
(坑集)Django环境配置
查看>>
利用padding-top/padding-bottom百分比,进行占位和高度自适应
查看>>
常用的监控系统资源的工具
查看>>
08ssm三大框架整合以前步骤
查看>>
R语言学习笔记之八
查看>>
正则表达式语法(msdn)
查看>>
MySQL 数据类型 详解 (转载)
查看>>
Maven学习笔记(一)
查看>>