自定义 Helper Method

摘自小牛之路

自定义 Helper Method 模板

前面我们简要介绍了 Helper Method 模板根据 Model 元数据生成 Html 元素的便捷之处。但有时候MVC提供的模板并不能满足我们的需求,这时我们可以为 Model 对象的某个属性自定义一个 Helper Method 模板。

在前文中我们知道,使用 Html.DropDownList(For) 可以为我们创建一个下拉列表,但这个方法有一点不好使,每次使用都需要给它构造器的第二个参数指定数据源,很是不方便。对于频繁使用的下拉列表,我们可以把它做成模板。下面我将通过为 Role 枚举类型(前文有定义)做一个下拉列表模板来演示如何自定义。

按照约定,MVC框架会在 /Views/Shared/EditorTemplates 文件夹下查找自定义的模板。因此我们需要先添加一个EditorTemplates 文件夹,然后在该文件夹下添加一个 Role.cshtml 文件,代码如下:

@model MvcApplication1.Models.Role

@Html.DropDownListFor(m => m, new SelectList(Enum.GetNames(Model.GetType()), Model.ToString()))

这样就做好了一个模板,我们可以像下面这样在一个View中使用它:

@model MvcApplication1.Models.Person

@Html.EditorFor(m => m.Role)

除了 EditorFor,调用任何一个模板化的Helper Method 为 Role 类型的属性呈现元素时都会显示为一个下拉列表,效果如下:

为了让这个功能更通用,使所有枚举类型都可以显示为这样的下拉列表,我们再改造一下这个功能。

删除原来的 Role.cshtml 文件,在同一目录下再新建一个 Enum.cshtml 分部视图,代码参考如下:

@model Enum

@Html.DropDownListFor(m => m, Enum.GetValues(Model.GetType()).Cast<Enum>()
    .Select(m => {
        string enumVal = Enum.GetName(Model.GetType(), m);
        return new SelectListItem() {
            Selected = (Model.ToString() == enumVal),
            Text = enumVal,
            Value = enumVal
        };
    })
)

然后我们可以在 Model 中通过 UIHint 特性来应用它,如下:

public class Person {
    public int PersonId { get; set; }
    ...
    [UIHint("Enum")]
    public Role Role { get; set; }
}

再运行程序看到的效果是和上面一样的。

注意,MVC 是根据属性的类型在 /Views/Shared/EditorTemplates 目录下找自定义的模板的,所以一定要保证模板的文件名和属性类型名一致(或用UIHint特性指定为模板的名称)。

另外,如果自定义的模板和内置的模板同名,MVC会使用自定义的。可以根据这个特点来用自定义的模板替换系统内置的。例如,如果在 EditorTemplates 文件夹下创建一个 Boolean.cshtml,当MVC要为 Boolean 类型的属性呈现 Html 元素时,它会使用自定义的 Boolean.cshtml 分部视图来呈现。

时间: 2024-08-06 20:44:59

自定义 Helper Method的相关文章

handlebars自定义helper的写法

handlebars相对来讲算一个轻量级.高性能的模板引擎,因其简单.直观.不污染HTML的特性,我个人特别喜欢.另一方面,handlebars作为一个logicless的模板,不支持特别复杂的表达式.语句,只内置了一些基本的语法,像if.each这些.可惜的是就连if都十分弱,只能判断值是否为true/false,或转化后是否为true/false,不能对值进行比较.不过,handlebars提供了自定义helper的能力,通过自定义helper,可以实现非常丰富的功能.本篇来总结一下hand

AspNet MVC4 教学-27:Asp.Net MVC4 自定义helper及function的快速Demo

A.创建Basic类型项目. B.创建App_Code文件夹,在里面创建2个cshtml文件: MyHelper.cshtml: @helper MyTruncate(string input, int length) { <text>来自App_Code中的Helper->MyTruncate:</text> if (input.Length <= length) { @input } else { @input.Substring(0, length) } } @h

Laravel Vuejs 实战:开发知乎 (33)自定义helper方法

参考: laravel 中添加自定义辅助函数helpers.php laravel自定义公共函数的引入怎么使用 Laravel增加自定义助手函数 Laravel 添加自定义全局函数 laravel 添加帮助类在helper 辅助函数 Laravel 目录结构:自定义函数的存放位置 创建 app/Http/helpers.php文件 修改 compose.json文件 1 "autoload": { 2 "classmap": [ 3 "database/s

Handlebars自定义Helper的使用方法

环境是backbone! 首先要声明: 1 Handlebars.registerHelper('roomnameDisplay', function(flag) { 2 return flag?'roomname-hide':''; 3 }); 在模板里的调用: var SecretList = fliza.List.extend({ …………其他代码 ' <a class="fromroom {{roomnameDisplay roomnameHide}}" target=&

yii2.0 自动加载自定义helper类

使用的是基础模板 不是高级模板 实现自动加载类修改yii框架下的classes.php实现 在程序中 直接使用方法即可

springmvc 自定义注解 以及自定义注解的解析

1,自定义注解名字 @Target({ElementType.TYPE, ElementType.METHOD})   //类名或方法上@Retention(RetentionPolicy.RUNTIME)//运行时 @component//自定义多个注解,且在一个类中添加两个或以上的,只需要加一个 否则会实例化多次.public @interface SocketMapping { String value() default "";//参数} 2.测试类 @SocketMappin

ASP.NET MVC 4 (六) 帮助函数

帮助函数封装一些代码,方便我们在应用程序中重用,MVC内建很多帮助函数,可以很方便的生成HTML标记.首先列出后面示例中用到的数据模型类定义: namespace HelperMethods.Models { public partial class Person { public int PersonId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public

SQL注入原理讲解

原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号.密码等互联网信息被盗取的普遍担忧. 网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,由于设计的漏洞导致了不可收拾的恶果,验证了一句话“出来混的,迟早是要还的”,所

Apache Torque入门学习

Introduction Apache Torque is an object-relational mapper for java. In other words, Torque lets you access and manipulate data in a relational database using java objects. Unlike most other object-relational mappers, Torque does not use reflection to