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

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

    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/zcm123/p/3158355.html

你可能感兴趣的文章
JAVA中的线程机制(二)
查看>>
nginx安装与配置2(转载)
查看>>
Linux下Mongodb安装和启动配置
查看>>
2015 成长计划
查看>>
沈阳一饭店凌晨爆燃,燃气报警器时刻预防
查看>>
Redis 与 数据库处理数据的两种模式
查看>>
VUE2中axios的使用方法
查看>>
assert 断言
查看>>
CS 229 notes Supervised Learning
查看>>
jQuery,ajax,for循环使用典型案例
查看>>
2018.10.27-dtoj-3996-Lesson5!(johnny)
查看>>
genimage.cfg.template hacking
查看>>
DataTable转换成json字符串
查看>>
RecyclerView重用导致的元素重复问题
查看>>
iOS网络协议----HTTP/TCP/IP浅析
查看>>
ubuntu 12.04 安装 redis
查看>>
基于多线程实现套接字服务端支持并发
查看>>
IOS_CGRect
查看>>
Sql Server中不常用的表运算符之APPLY(1)
查看>>
【DM642】ICELL Interface—Cells as Algorithm Containers
查看>>