为Html.EditorForModel自定义模版
对于MVC视图渲染来说,大家应该不会陌生,但对于模型的渲染,不知道是否听说过,主要是说Model通过它属性的相关特性(DataType,UIHint)来将它们自动渲染到View上,这是一个比较不错的技术,因为使用传统的Html.EditorForModel去渲染是不能满足我们要求的,因为他只是在页面上渲染Input文本框,如果希望出现下拉列表,复杂的单选和复选,它是实现不了的,这需要我们进行定制,即自定义的模版!
模版文件夹位于shared/EditorTemplates/下面
aaarticlea/png;base64,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" alt="" />
这些模版需要通过模型属性的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会动态去自动渲染!
这种功能对插件模块开发,换肤开发很有效果!
为Html.EditorForModel自定义模版的更多相关文章
- 爱上MVC~为Html.EditorForModel自定义模版
回到目录 挺有意思的一件事 对于MVC视图渲染来说,大家应该不会陌生,但对于模型的渲染,不知道是否听说过,主要是说Model通过它属性的相关特性(DataType,UIHint)来将它们自动渲染到Vi ...
- html.EditorForModel自定义模版
https://www.cnblogs.com/lori/p/5969658.html http://www.cnblogs.com/yinzixin/archive/2012/12/18/2821 ...
- Zabbix--04 自定义模版、web监控
目录 一.自定义模版 1.创建模版 2.导出模版 3.监控TCP11种状态 3.2.重启zabbix-agent 3.3.测试监控项 4.导入模版文件 5.主机关联模版文件 6.查看最新数据 7.查看 ...
- PyCharm 自定义模版
PyCharm 自定义模板 创建一个新的模板: 点击 Preferences... 选项或者按下快捷键 Command(⌘) + , 打开设置对话框. 找到 在 Editor 下的 File and ...
- django 自定义模版过滤器
自定义的模版过滤器必须要放在app中,并且该app必须在INSTALLED_APPS中进行安装.然后再在这个app下面创建一个python包叫做templatetags(这个名字是固定的,不能随意更改 ...
- php调用微信发送自定义模版接口
function sendWechatmodel($openid,$data,$go_url)//接受消息的用户openid,发送的消息,点击详情跳转的url { ...
- Django 自定义模版标签和过滤器
实现自定义过滤器 1. 创建register变量 在你的模块文件中,你必须首先创建一个全局register变量,它是用来注册你自定义标签和过滤器的, 你需要在你的python文件的开始处,插入几下代码 ...
- Spring框架学习笔记(4)——SSM整合以及创建Maven自定义模版
Spring+Spring MVC+MyBatis+Maven SSM整合的核心还是Spring+MyBatis的整合,回顾一下MyBatis操作数据库流程,我们是使用一个SQLSessionFact ...
- idea自定义模版
点小灯 编辑live模版设置 模版全称 private static final Logger logger = LoggerFactory.getLogger($classname$.class); ...
随机推荐
- python中的参数、全局变量及局部变量
1.位置参数.关键字参数.默认参数的使用 位置参数.关键字参数 def test(x,y,z): print(x) print(y) print(z) test(1,2,3) #位置参数,必须一一对应 ...
- ubuntu18.04 server配置静态ip
最新发布的ubuntu18.04 server,启用了新的网络工具netplan,对于命令行配置网络参数跟之前的版本有比较大的差别,现在介绍如下:1.其网络配置文件是放在/etc/netplan/50 ...
- Cisco路由器交换机基础配置
交换机配置 交换机基本状态: switch: # ROM状态, 路由器是rommon> hostname> # 用户模式 hostname# # 特权模式 hostname(config) ...
- POJ 3259 Wormholes(负权环路)
题意: 农夫约翰农场里发现了很多虫洞,他是个超级冒险迷,想利用虫洞回到过去,看再回来的时候能不能看到没有离开之前的自己,农场里有N块地,M条路连接着两块地,W个虫洞,连接两块地的路是双向的,而虫洞是单 ...
- bootspring网站项目,Date类型插入数据库始终比正确时间早一天问题的解决
bug描述 昨天的Date插入不进去问题解决后,一直没发现其实插入的时间一直比正确的时间早一天 输出sql语句,发现insert语句还是对的,不知道为什么插入数据库之后结果就早了一天 https:// ...
- maven+struts2环境搭建
首先在struts2.xml文件配置一个包,在包中配置一个action,新建action,新建视图,在action中定义由method定义的方法,这个方法一定要返回String类型,返回的是视图的名称 ...
- git学习(一)----基础知识
git是世界上最好用最先进的版本管理系统,那么什么是版本管理系统呢,百度上是这样说的: 举个例子,当你写毕业论文的时候,灵感爆发了修改或者删除了一些内容,但是你还想保留之前的版本,就需要另存为不同的w ...
- ZOJ 3811 Untrusted Patrol【并查集】
题目大意:给一个无向图,有些点有装监视器记录第一次到达该点的位置,问是否存在一条路径使得监视器以给定的顺序响起,并且经过所有点 思路:牡丹江网络赛的题,当时想了种并查集的做法,通神写完程序WA了几发, ...
- HDU 2767 Proving Equivalences(强连通 Tarjan+缩点)
Consider the following exercise, found in a generic linear algebra textbook. Let A be an n × n matri ...
- js获取json属性值的两种方法
1.json.XXX 2.json["XXX"] 第二种方法使用场景,当属性值是变量时.如图所示: