自定义helpermethod

武怡然 武怡然     2022-08-13     341

关键词:

摘自小牛之路

自定义 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 分部视图来呈现。 

自定义ui自定义布局(代码片段)

系列文章目录自定义UI基础知识自定义UI绘制饼图自定义UI圆形头像自定义UI自制表盘自定义UI简易图文混排自定义UI使用Camera做三维变换自定义UI属性动画自定义UI自定义布局文章目录系列文章目录前言布局流程简介具体流程实现... 查看详情

springsecurity自定义指南(代码片段)

序本文主要研究一下几种自定义springsecurity的方式主要方式自定义UserDetailsService自定义passwordEncoder自定义filter自定义AuthenticationProvider自定义AccessDecisionManager自定义securityMetadataSource自定义access访问控制自定义authenticationEntryPoint自... 查看详情

springboot+自定义注解+自定义aop前置增强+自定义异常+自定义异常捕获

...拦截但是后来还是说声算了.想到使用AOP的前置增强和自定义异常和自定义异常捕获可以解决这个问题,一次性用了这么多,就是想把之前比较模糊的东西重新拿起来1.我们先自定义一个注解1/**2*@program:shiro-demo3*@description:自定义注解... 查看详情

自定义容器和自定义转换

】自定义容器和自定义转换【英文标题】:CustomContainersandCustomTransitions【发布时间】:2013-11-1621:13:25【问题描述】:自定义转场很容易与标准容器配合使用,同时呈现模态视图控制器。但是在完全自定义的容器中使用自定义转换... 查看详情

未找到具有自定义分页 404 的自定义分类和自定义帖子类型

】未找到具有自定义分页404的自定义分类和自定义帖子类型【英文标题】:Customtaxonomyandcustomposttypewithcustompagination404notfound【发布时间】:2014-10-2601:33:55【问题描述】:当来自General->Reading的帖子小于我的自定义分类cities(自定... 查看详情

自定义 Combobox 控件自定义数据源,带有自定义 displaymember 和 valuemember

】自定义Combobox控件自定义数据源,带有自定义displaymember和valuemember【英文标题】:CustomComboboxcontrolcustomdatasourcewithcustomdisplaymemberandvaluemember【发布时间】:2011-01-1810:51:48【问题描述】:我正在开发一个继承自另一个组合框(JanusUI... 查看详情

wpf自定义控件中使用自定义事件

wpf自定义控件中使用自定义事件 1创建自定义控件及自定义事件123456789101112131415161718192021222324252627282930313233343536    /// <summary>    /// 演示用的自定义控件   查看详情

将自定义视图放入自定义 ScrollView

】将自定义视图放入自定义ScrollView【英文标题】:PuttingCustomViewInsideaCustomScrollView【发布时间】:2014-03-1002:16:16【问题描述】:我正在创建一个带有自定义视图和自定义ScrollView的Android应用。我正在尝试将自定义视图放在滚动视... 查看详情

自定义ui自定义布局(代码片段)

系列文章目录自定义UI基础知识自定义UI绘制饼图自定义UI圆形头像自定义UI自制表盘自定义UI简易图文混排自定义UI使用Camera做三维变换自定义UI属性动画自定义UI自定义布局文章目录系列文章目录前言布局流程简介具体流程实现... 查看详情

在自定义单元格中设置自定义附件类型

】在自定义单元格中设置自定义附件类型【英文标题】:Setcustomaccessorytypeincusomcell【发布时间】:2015-02-0622:51:33【问题描述】:我有一个自定义的UITableViewCell,我想给它添加一个自定义的附件类型。我可以在cellForRowAtIndexPath中设... 查看详情

带有自定义按钮的自定义 UIAlertView

】带有自定义按钮的自定义UIAlertView【英文标题】:CustomUIAlertViewwithCustomButtons【发布时间】:2011-06-2210:34:42【问题描述】:我需要显示一个自定义UIAlertView,它将有一个图像作为背景和两个自定义按钮,它们不是常规的UIAlertView... 查看详情

使用自定义动画删除自定义 UIStoryboardSegue

】使用自定义动画删除自定义UIStoryboardSegue【英文标题】:RemovecustomUIStoryboardSeguewithcustomanimation【发布时间】:2012-10-2608:12:05【问题描述】:我已经看到了几个如何使用自定义动画呈现自定义UIStoryboardSegue的示例。基本上,您将UI... 查看详情

如何显示自定义帖子类型的自定义字段

】如何显示自定义帖子类型的自定义字段【英文标题】:howtodisplaycustomfieldsfromcustomposttypes【发布时间】:2021-11-2606:45:23【问题描述】:我使用“高级自定义字段”和“自定义帖子类型UI”插件来创建自定义帖子类型和自定义字段... 查看详情

自定义格式

2.自定义格式-[email protected]中国共产2.1自定义格式-[email protected]中国共产2.1.1自定义格式-[email protected]中国共产2.1.1.1自定义格式-[email protected]中国共产2.1.1.1.1自定义格式-[email protected]中国共产自定义格式-[email&# 查看详情

自定义ui属性动画(代码片段)

系列文章目录自定义UI基础知识自定义UI绘制饼图自定义UI圆形头像自定义UI自制表盘自定义UI简易图文混排自定义UI使用Camera做三维变换自定义UI属性动画自定义UI自定义布局文章目录系列文章目录前言属性动画和视图动画的区别an... 查看详情

具有自定义形状的自定义 ImageView

】具有自定义形状的自定义ImageView【英文标题】:CustomImageViewWithaCustomShape【发布时间】:2016-12-2710:23:40【问题描述】:我正在尝试创建一个自定义ImageView,它在自定义边框和形状而不是默认矩形内显示图像,并且边框的外侧是Tr... 查看详情

Flex 4 从自定义组件调度自定义事件(为啥 flex 将自定义事件转换为 mouseevent)

】Flex4从自定义组件调度自定义事件(为啥flex将自定义事件转换为mouseevent)【英文标题】:Flex4disptachingcustomeventfromcustomcomponent(whyflexconvertingcustomeventtomouseevent)Flex4从自定义组件调度自定义事件(为什么flex将自定义事件转换为mous... 查看详情

自定义view系列一自定义view的构造函数,自定义属性(代码片段)

...22/article/details/51147893;本文出自:【梁大盛的博客】自定义View系列一自定义View的构造函数,自定义属性引:自定义View对于Android开发者是一道坎.虽然说是坎但是也得走过去的!此系列文章作为学习自定义View的一系列学习笔记.在... 查看详情