原文地址:http://weblogs.asp.net/stephenwalther/archive/2008/06/13/asp-net-mvc-tip-1-creating-new-html-helpers-with-extension-methods.aspx

摘要:在这个Tip中,Stephen Walther创建了两个新的HTML Helper,你可以直接在ASP.NET MVC视图中使用它们。Stephen Walther展示了如何用扩展方法创建用于显示无序列表和有序列表的HTML Helper。

在为ASP.NET MVC应用程序创建视图时,你可以使用HTML Helper来呈现标准的HTML标签。例如,对于下面的代码:

<input name="inpSubmit" type="submit" value="Click Here!" />

可以写为:

<%= Html.SubmitButton("inpSubmit", "Click Here!") %>

后面这种写法可以为你节省大量的时间。但如果没有与你要呈现的标签对应的HTML Helper呢?例如,假设你要在视图中为数据库记录显示一个无序列表。HtmlHelper类中并未包含用于显示无序列表的方法。别灰心,如果HTML Helper中没有你需要的方法,尽管去扩展它吧!

通过建立新的扩展方法,你可以向HtmlHelper类添加新的功能。扩展方法看上去和普通的实例方法类似。然而,与实例方法不同,你可以在完全不同的类中为另外一个类添加扩展方法。

在Visual Basic .NET中,创建扩展方法的方法是创建一个模块,并用一个特殊的特性来声明一个方法。在C#中,可以在一个静态类中定义扩展方法,并使用关键字this来指出要扩展的类。

下面展示了如何为HtmlHelper类添加扩展方法来为数据库记录显示有序列表和无序列表:

清单1 - ListExtensions.vb (VB.NET)

 1Imports System
 2Imports System.Collections
 3Imports System.Text
 4Imports System.Web
 5Imports System.Web.Mvc
 6Imports System.Runtime.CompilerServices
 7
 8Namespace HtmlHelpersNamespace HtmlHelpers
 9    Public Module ListExtensionsModule ListExtensions
10        <Extension()> _
11        Public Function OrderedList()Function OrderedList(ByVal HtmlHelper As HtmlHelper, ByVal items As Object) As String
12            Return "<ol>" + ListExtensions.GetListItems(items) + "</ol>"
13        End Function
14
15        <Extension()> _
16        Public Function UnorderedList()Function UnorderedList(ByVal HtmlHelper As HtmlHelper, ByVal items As Object) As String
17            Return "<ul>" + ListExtensions.GetListItems(items) + "</ul>"
18        End Function
19
20        Private Function GetListItems()Function GetListItems(ByVal items As Object) As String
21            If items Is Nothing Then
22                Throw New ArgumentNullException("items")
23            End If
24            If Not TypeOf items Is IEnumerable Then
25                Throw New InvalidCastException("items must be IEnumerable")
26            End If
27
28            Dim EnumItems As IEnumerable = CType(items, IEnumerable)
29            Dim builder As New StringBuilder()
30
31            For Each item As Object In EnumItems
32                builder.AppendFormat("<li>{0}</li>", HttpUtility.HtmlEncode(item.ToString()))
33            Next
34
35            Return builder.ToString()
36        End Function
37    End Module
38End Namespace

清单1 - ListExtensions.cs (C#)

using System;
using System.Collections;
using System.Text;
using System.Web;
using System.Web.Mvc;
 
namespace BulletedListHelper.HtmlHelpers
{
    public static class ListExtensions
    {
        public static string OrderedList(this HtmlHelper helper, Object items)
        {
            return "<ol>" + ListExtensions.GetListItems(items) + "</ol>";
        }
 
        public static string UnorderedList(this HtmlHelper helper, Object items)
        {
            return "<ul>" + ListExtensions.GetListItems(items) + "</ul>";
        }
 
        private static string GetListItems(Object items)
        {
            if (items == null)
                throw new ArgumentNullException("items");
            if (items is IEnumerable == false)
                throw new InvalidCastException("items must be IEnumerable");
 
            var enumItems = (IEnumerable)items;
            var builder = new StringBuilder();
            foreach (Object item in enumItems)
                builder.AppendFormat("<li>{0}</li>", HttpUtility.HtmlEncode(item.ToString()));
            return builder.ToString();
        }
 
    }
}

ListExtensions类有两个公共方法——OrderedList()和UnorderedList()。将集合分别传入两个方法,可以分别显示有序和无序列表。注意这些方法返回的是字符串。的确,HTML Helper方法的作用就是向浏览器呈现一个格式化的字符串。

创建完扩展方法后,你可以在视图中像下面这样使用它:

清单2 - Index.aspx

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="BulletedListHelper.Index" %>
<%@ Import Namespace="BulletedListHelper.HtmlHelpers" %>
 
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
    <h1>Movies (Ordered)</h1>
    <%= Html.OrderedList(ViewData.Model) %>
    <h1>Movies (Unordered)</h1>
    <%= Html.UnorderedList(ViewData.Model) %>
</asp:Content>

注意在文件的顶部引入了BulletedList.HtmlHelpers命名空间。Html.OrderedList()用于呈现有序列表,而Html.UnorderedList()用于呈现无序列表。注意在View的Html属性所暴露的HtmlHelper对象上调用了这些方法,和其他扩展方法一样。当你在浏览器中打开该视图时,可以得到如图1所示的页面:

图1 - 使用自定义HTML Helper呈现的Index.aspx

最后清单3给出了HomeController所暴露的Index()方法,该方法展示了如何将一个电影记录集合传递给Index.aspx视图。电影记录是利用Linq to SQL查询得到的。

清单3 - HomeController.vb (VB.NET)

Public Class HomeControllerClass HomeController
     Inherits System.Web.Mvc.Controller
 
     Private db As New MoviesDataContext()
 
     Function Index()Function Index()
         Dim movies = From m In db.Movies Select m.Title
         Return View(movies)
     End Function
End Class

清单3 - HomeController.cs (C#)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using BulletedListHelper.Models;
 
namespace BulletedListHelper.Controllers
{
     public class HomeController : Controller
     {
         private MoviesDataContext db = new MoviesDataContext();  
 
         public ActionResult Index()
         {
             var movies = from m in db.Movies select m.Title;
             return View(movies);
         }
     }
}

你可以使用这种方式向ASP.NET MVC视图中呈现几乎任何东西。例如,你可以使用类似的方法创建TreeView、Menu、TabStrip等等。

此处下载源代码:http://weblogs.asp.net/blogs/stephenwalther/Downloads/Tip1/ListHtmlHelpers.zip

转载于:https://www.cnblogs.com/mzoylee/archive/2008/12/09/1351381.html

(转)[翻译] ASP.NET MVC Tip #1 - 使用扩展方法创建新的HTML Helper相关推荐

  1. 在Asp.net MVC framework中使用扩展方法创建Html Helper

    HtmlHelper提供了一些帮助的方法返回一个字符串来生成html. 在System.Web.Mvc.Html命称空间下有一些表单,控件,局部视图Helper方法.我将创建一个生成标签<inp ...

  2. ASP.NET MVC Tip #31: 给 Master Pages 和 User Controls 传递数据

    原文地址:ASP.NET MVC Tip #31 – Passing Data to Master Pages and User Controls 原文作者:swalther 本文译者:QLeelul ...

  3. ASP.NET MVC ETag Cache等优化方法

    背景 最近有一个项目是用SmartAdmin + Jquery + EasyUI 一个ASP.NET MVC5的项目,一直存在一个性能问题,加载速度比较慢,第一次加载需要(在没有cache的情况下)需 ...

  4. [翻译-ASP.NET MVC]Contact Manager开发之旅迭代3 - 验证表单

    本翻译系列为asp.net mvc官方实例教程.在这个系列中,Stephen Walther将演示如何通过ASP.NET MVC framework结合单元测试.TDD.Ajax.软件设计原则及设计模 ...

  5. [翻译-ASP.NET MVC]Contact Manager开发之旅

    本翻译系列为asp.net mvc官方实例教程.在这个系列中,Stephen Walther将演示如何通过ASP.NET MVC framework结合单元测试.TDD.Ajax.软件设计原则及设计模 ...

  6. ASP.NET MVC呼叫WCF Service的方法

    本演示,Insus.NET操练asp.net mvc的应用程序,虽然以前有写过: <MVC应用程序使用Wcf Service>http://www.cnblogs.com/insus/p/ ...

  7. [ASP.NET MVC]通过对HtmlHelper扩展简化“列表控件”的绑定

    在众多表单元素中,有一类<select>元素用于绑定一组预定义列表.传统的ASP.NET Web Form中,它对应着一组重要的控件类型,即ListControl,我们经常用到DropDo ...

  8. [翻译]ASP.NET MVC 3 开发的20个秘诀(十二)[20 Recipes for Programming MVC 3]:缩放图片尺寸创建缩略图...

    议题 用户上传到网站上的大多数的图片都是大尺寸的照片,通常在用户想看完整图片之前网站会展示出这些图片或照片的缩略图. 解决方案 使用以下的类来调整上传的图片文件的宽和高:FileStream,Imag ...

  9. Asp.net MVC模型数据验证扩展ValidationAttribute

    在Asp.Mvc项目中有自带的一套完整的数据验证功能,客户端可以用HtmlHelper工具类,服务端可以用ModelState进行验证.而他们都需要System.ComponentModel.Data ...

最新文章

  1. Linux下安装Weblogic10.3.6并创建简单集群测试
  2. element ui 获取文件的路径_win10使用WinAppDriver实现UI自动化
  3. while循环里面scanf_5.1 for循环
  4. 程序员:你的业余时间是怎么被浪费掉的?
  5. python脚本判断一个数是否为素数的几种方法
  6. display 隐藏css,CSS-元素的显示与隐藏
  7. 设计实现java的指针分析系统_JAVA程序设计
  8. LINUX UBUNTU安装依赖库编译freeswitch
  9. vfp体积计算机程序,计算机vfp教程第9章 报表与菜单设计
  10. 数据库系统概论第五版(第 5 章数据库完整性)习题答案
  11. 操作无法完成 打印后台程序服务没有运行
  12. 文本分类,数据挖掘和机器学习
  13. linux纯文本无法键入密码,Apple Mac OS X FileVault纯文本密码本地安全限制绕过漏洞...
  14. 我要做-微处理器嵌入式系统设计师
  15. 游戏的帧率与屏幕的刷新率
  16. Win10 下Go语言和Goland的下载和环境配置
  17. 使用Mahout实现协同过滤
  18. 远景在线(www.pcbeta.com):使用IE10登陆中国银行网银蓝屏或者死机的解决方案
  19. 学习C++编程的必备软件
  20. 全国人工智能师资培训高校行重磅启动,飞桨携手7校开启AI学习之旅

热门文章

  1. 2048c语言程序,C语言实现2048小游戏
  2. in最多可以放多少?_车子不开,最多可以停放多少天?维修工:别超过这个时间...
  3. 实验报告三c语言,C语言实验报告三
  4. SaltStack介绍——SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流...
  5. collections模块
  6. python3+django写的个人笔记博客
  7. poj 3481 平衡树
  8. [转] context-param与init-param的区别与作用
  9. GNU make manual 翻译( 一百八十三)
  10. [原创]一起来做网页游戏---前言