回到目录

挺有意思的一件事

对于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会动态去自动渲染!

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

回到目录

爱上MVC~为Html.EditorForModel自定义模版的更多相关文章

  1. 为Html.EditorForModel自定义模版

    对于MVC视图渲染来说,大家应该不会陌生,但对于模型的渲染,不知道是否听说过,主要是说Model通过它属性的相关特性(DataType,UIHint)来将它们自动渲染到View上,这是一个比较不错的技 ...

  2. html.EditorForModel自定义模版

    https://www.cnblogs.com/lori/p/5969658.html  http://www.cnblogs.com/yinzixin/archive/2012/12/18/2821 ...

  3. Django---MTV和MVC的了解,Django的模版语言变量和逻辑,常见的模板语言过滤器,自定义过滤器,CSRF了解,Django的母版(继承extends,块block,组件include,静态文件的加载load static),自定义simple_tag和inclusion_tag

    Django---MTV和MVC的了解,Django的模版语言变量和逻辑,常见的模板语言过滤器,自定义过滤器,CSRF了解,Django的母版(继承extends,块block,组件include,静 ...

  4. YbSoftwareFactory 代码生成插件【二十四】:MVC中实现动态自定义路由

    上一篇介绍了 公文流转系统 的实现,本篇介绍下MVC下动态自定义路由的实现. 在典型的CMS系统中,通常需要为某个栏目指定个友链地址,通过指定友链地址,该栏目的地址更人性化.方便记忆,也有利用于搜索引 ...

  5. (翻译)为你的MVC应用程序创建自定义视图引擎

    Creating your own MVC View Engine For MVC Application 原文链接:http://www.codeproject.com/Articles/29429 ...

  6. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

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

    目录 一.自定义模版 1.创建模版 2.导出模版 3.监控TCP11种状态 3.2.重启zabbix-agent 3.3.测试监控项 4.导入模版文件 5.主机关联模版文件 6.查看最新数据 7.查看 ...

  8. 爱上MVC~一个Action多套View模版的设计

    回到目录 模块化 这个问题是在做模块化设计时出现的,在Lind.DDD.Plugins模块里,需要对应的模块实体,模块管理者,模块标识接口等,开发时,如果你的功能点属于一个模块,需要实现IPlugin ...

  9. MVC之路由规则 (自定义,约束,debug)

    自定义路由规则的要求,小范围写在前,大范围写在后.路由规则可以注册多条,路由规则的名称不能重复路由规则有顺序,并且按照顺序进行匹配,建议小范围写在前,大范围写在后.路由规则可以设置约束 即正则表达式路 ...

随机推荐

  1. java 读取文件内容 三种形式及效率对比

    IOUtils.getStringFromReader() 读取方式为最快的 InputStream in = null; String line = ""; long start ...

  2. php代码优化系列 -- array_walk 和 foreach, for 的效率的比较

    实验是我学习计算机科学的一个重要方法,计算机科学不是简单的智力游戏,它本质上来说不是一门科学,而是一个改造世界的工具.数学方法和实验方法是计算机研究的基本方法,也是我们学习的基本方法,数学锻炼我们的思 ...

  3. 用户行为数据采集核心思维(APP、web数据采集/埋点)

    关于数据采集(也就是所谓的埋点),有很多中形式,或者说方法.所有的数据采集都时围绕一个核心的三个点来做区别的处理. 数据采集核心思维三个点: 1.对象: 要采集谁,一个页面.一个按钮,页面或者按钮,就 ...

  4. emmet插件快捷键:

    概念:emmet插件是用在编辑器里面的一个可以快速编写代码的插件,比如sublime text中,就可以用它来快速创建代码,本文主要是在sublime text的编辑器中做的测试代码. 一.html ...

  5. windows10 technical preview 无法激活

  6. zmq中zmq_poll()函数介绍

    功能: 查看指定的多个socket上哪些socket发生了指定的事件, 事件有: ZMQ_POLLIN: 有消息到来 ZMQ_POLLOUT: 当前无阻塞可以发送消息 ZMQ_POLLERR: 只对标 ...

  7. JAVAWEB学习

    http://www.cnblogs.com/xdp-gacl/p/3744053.html JavaWeb学习总结(三)——Tomcat服务器学习和使用(二)

  8. Java学习笔记二——标识符和关键字

    标识符 定义 标识符的定义:对各种变量.方法和类等要素命名时使用的字符序列成为标识符. 简单地说,就是凡是自己可以起名字的地方都叫标识符,都要遵守标识符的规则. 命名规则 标识符只能由字母.下划线&q ...

  9. CSS中继承,特殊性,层叠与重要性

    继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码: <html><head> ...

  10. 用php创建mysql数据库

    接触php就等于向后台更近了一步,之前一直在做前端,不过也在学php,但一直没敢写博客,现在终于有勇气迈向了这一步,还请各位博友多多担待. 服务器是后台开发的必备工具,但对于一般初学者来说是没有自己的 ...