为Html.EditorForModel自定义模版

对于MVC视图渲染来说,大家应该不会陌生,但对于模型的渲染,不知道是否听说过,主要是说Model通过它属性的相关特性(DataType,UIHint)来将它们自动渲染到View上,这是一个比较不错的技术,因为使用传统的Html.EditorForModel去渲染是不能满足我们要求的,因为他只是在页面上渲染Input文本框,如果希望出现下拉列表,复杂的单选和复选,它是实现不了的,这需要我们进行定制,即自定义的模版!

模版文件夹位于shared/EditorTemplates/下面

这些模版需要通过模型属性的UIHint来指定,如[UIHint("_EnumDropdownList")],表示使用一个叫_EnumDropdownList.cshtml的模版文件来渲染这个属性,当然对于系统模版来说,你可以直接使用它们,也是使用UIHint特性来指定的.

下面代码中是我定义ViewModel的代码,有系统的UIHint,如MultilineText,Bool等,也有自定义的模版如_EnumRadio,_EnumCheckbox等

        [DisplayName("标题")]
        public string Name { get; set; }
        [DisplayName("年纪")]
        public int Age { get; set; }
        [DisplayName("Email")]
        [UIHint("MultilineText")]
        public string Email { get; set; }
        [DisplayName("类型_EnumRadio"), EnumDataType(typeof(Type))]
        [UIHint("_EnumRadio")]
        public Type Type { get; set; }
        [DisplayName("类型_EnumCheckbox"), EnumDataType(typeof(Type))]
        [UIHint("_EnumCheckbox")]
        public Type Type2 { get; set; }
        [DisplayName("类型_EnumDropdownList"), EnumDataType(typeof(Type))]
        [UIHint("_EnumDropdownList")]
        public Type Type3 { get; set; }
        [DisplayName("出生日期")]
        [UIHint("_DateTime")]
        public DateTime Birthday { get; set; }
        [DisplayName("性别")]
        [UIHint("Bool")]
        public bool Sex { get; set; }

我们来看一下,如何在/shared/EditorTemplates下建立自定义的模版,下面大叔将自己的几个模版分想一下

日期时间选择器

@model DateTime
@Html.TextBoxFor(m => m, new { onfocus = "WdatePicker({isShowWeek:true})", @class = "Wdate", })
<script src="~/Scripts/jquery-1.4.1.min.js"></script>
<script src="~/Scripts/My97DatePicker4.7/WdatePicker.js"></script>

枚举-下拉列表框

@model Enum
@using Lind.DDD.Utils;
@Html.DropDownListFor(m => m, Enum.GetValues(Model.GetType())
    .Cast<Enum>()
    .Select(m =>
    {
        int enumVal = Convert.ToInt32(m);
        return new SelectListItem()
        {
            Selected = (Convert.ToInt32(Model)== enumVal),
            Text = m.GetDescription(),
            Value = enumVal.ToString()
        };
    }))

枚举-单选按钮组

@model Enum
@using Lind.DDD.Utils;
@{
    var name = Model.GetType().Name;
    var list = Enum.GetValues(Model.GetType())
     .Cast<Enum>()
     .Select(m =>
     {
         int enumVal = Convert.ToInt32(m);
         return new SelectListItem
         {
             Selected = (Convert.ToInt32(Model) == enumVal),
             Text = m.GetDescription(),
             Value = enumVal.ToString()
         };
     });
}
@foreach (var item in list)
{
    string isSel = item.Value == Convert.ToInt32(Model).ToString() ? "checked=‘checked‘" : "";
    <input type="radio"  name="@name" id="@(name + item.Value)" value="@item.Value" @isSel/><label for="@(name + item.Value)">@item.Text</label>
}

枚举-筛选按钮组

@model Enum
@using Lind.DDD.Utils;
@{
    string name = ViewData.TemplateInfo.HtmlFieldPrefix;
    var list = Enum.GetValues(Model.GetType())
    .Cast<Enum>()
    .Select(m =>
    {
        int enumVal = Convert.ToInt32(m);
        return new SelectListItem()
        {
            Selected = (Convert.ToInt32(Model) == enumVal),
            Text = m.GetDescription(),
            Value = enumVal.ToString()
        };
    });
}
@foreach (var item in list)
{
    string isSel = item.Value == Convert.ToInt32(Model).ToString() ? "checked=‘checked‘" : "";

    <input type="checkbox" name="@name" id="@(name + item.Value)" value="@item.Value" @isSel/><label for="@(name + item.Value)">@item.Text</label>
}

怎么样,这种代码挺有意思吧,以后再渲染时,直接在属性上标识即可,它的View会动态去自动渲染!

这种功能对插件模块开发,换肤开发很有效果!

时间: 2024-08-07 08:24:47

为Html.EditorForModel自定义模版的相关文章

KM盒子V6.2自定义模版功能教程

KM盒子从V6.2版开始将原来的自定义首页功能升级为自定义模版功能,增加{img}文档缩图.{lit}标题.{liurl}链接.{descr}描述等模版标签的调用. 1.怎样使用自定义模版功能 我们在根目录节点"内容项目"节点上右键,在弹出的菜单中选择最下面的"自定义模版设置"菜单选项. 2.设置自定义模版 首先我们需要选择index.html首页文件,然后将"是否定制首页"选项选为"是". 3.了解模版目录结构 首页模版为根

vue 自定义模版组件

vue的组件可以自定义内容,属性 又有slot作配合 可以做出很多自定义模版 例子 <body> <div id="app"> <m-modal modal-title="提醒" @on-ok="ok"></m-modal> <m-modal> <ul slot="modal-content"> <li v-for="item of lis

Zabbix--04 自定义模版、web监控

目录 一.自定义模版 1.创建模版 2.导出模版 3.监控TCP11种状态 3.2.重启zabbix-agent 3.3.测试监控项 4.导入模版文件 5.主机关联模版文件 6.查看最新数据 7.查看图形 二.自定义模版监控nginx状态 1.开启监控页面并访问测试 2.准备nginx监控状态脚本 3.编写zabbix监控配置文件 4.使用zabbix_get取值 5.导入模版 6.链接模版 7.查看数据 三.自定义模版监控php状态 1.开启监控页面 2.访问测试 3.准备访问脚本 4.准备z

zabbix3.2的使用与自定义模版

前面说了zabbix的安装,这节我们来说zabbix的使用 首先打开zabbix-web端,我们来创建一台监控主机,上节我们已经添加了node2的agent指向了server端 1.打开web端 ,配置--主机--创建主机,完成后点击下面的添加 2.自定义监控项items, 编辑agent配置文件, /etc/zabbix/zabbix_agentd.conf.配置UserParameter,重启agent UserParameter用法为UserParameter=key,command  k

自定义模版渲染DOM{{keyword}}使用方法

1 //目标DOM节点 2 var renderTarget=document.getElementById('ul1'); 3 4 //渲染模版 5 var tpl= '<li data-elem="item" data-title="{{subTitle}}" data-vid="{{videoId}}" data-tvid="{{tvId}}" data-albumid="{{albumId}}"

Django 自定义模版标签和过滤器

实现自定义过滤器 1. 创建register变量 在你的模块文件中,你必须首先创建一个全局register变量,它是用来注册你自定义标签和过滤器的, 你需要在你的python文件的开始处,插入几下代码: from django import templateregister = template.Library() 2. 定义过滤器函数 自定义的过滤器就是一个带1,2个参数的python函数,一个参数放变量值,一个用来放选项值. 比如{{ var|remove:"bar" }}, va

重新执笔,已是大三!Jekyll自定义主题开发

“一转眼忘了时间 丢了感觉 黑了世界 再逞强 再疯狂 也会伤 不知 不觉 后知 后觉 然后 发现 失去 知觉 ”——<一吻不天荒> 时间是把双刃剑,什么解决不了,忧烦的,慢慢变淡,消失.我也即将毕业,面临找工作,写毕业论文这要的大事,过去的已经过程,已经不想去做去想荒唐,无聊的事. 为此,我打算写日记与文章来记录这个关键时间段.如果我找到了月新过6K的工作,请记得这真的来之不易. 如果同样是大三的伙伴,请留言支持一下吧!你的鼓励是莫大的安慰! 在这段时间,我计划先做一个人Blog,基于jeky

Android学习(十七)自定义View控件 TopBar

一.创建自定义TopBar头部菜单条 实现步骤: 1.在values中添加attrs.xml文件,设置自定义属性. 2.添加Topbar类,继承RelativeLayout,实现具体功能. 3.添加到页面上,并设置添加事件. 参考代码: values\attrs.xml <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="Top

zbrush模版调控板介绍

今天小编来教大家认识zbrush模版调控板. ZBrush模版的作用象我们了解的所有绘制工具,通过它确定模版周围与涂画或模型的位置,下面是怎样使用默认的 “曲线板”模版或使用自定义形状: 1.打开Stencil(模版)调控版并激活模版,将出现默认的 “曲线板”. 2.使用StencilCoinController(模版铸造控制器)改变大小和位置. 3.通过模版或周围绘画或建模. 象Alpha,Stencil(模版)敏感于灰度值,即一个区域用50%灰度值允许在50%强度下绘画和雕塑. 自定义模版形