流畅地HtmlHelper-Asp.Net MVC
今天抛开 Fluent NHibernate 不谈,我们来谈谈 Asp.Net MVC ,在MVC的View中,我们经常会使用HtmlHelper来生成各种html代码(可能描述不太清楚看代码吧,呵呵)。
HtmlHelper原先的功能不是很多,还好有很多扩展方法,我们能用它来生成一个Input控件,比如:
<%= Html.TextBox("UserID") %>
我们使用上面的代码能生成一个没有值的单行文本框,我们还可以使用:
<%= Html.TextBox("UserID", Model.User.UserID, new { @class="class" })%>
给这个文本框加值,加样式,与之对应的html代码:
<input type="text" id="UserID" name="UserID" class="class" value="<%=Model.User.UserID %>" />
确实很方便,有了扩展方法,我们能很方便的创建各种控件,包括form,但如果你要生成很多控件呢?随便说个例子,比如你要添加一个产品,可能它会有几十个属性,意味着你要写几十个Html.TextBox(属性值) (这里可以是其他控件),其实也没有什么,不过真的很不爽,可能我习惯了 Fluent NHibernate 的映射方式,我一直想着使用以下的方式来生成控件:
<%= Html.TextBox<User>(u => u.UserID, Model.User.UserID, new { @class="class"}) %>
怎么样,是不是代码看上去很优美,少去了硬编码,怎么看都好看,哈哈,但是HtmlHelper没有这种扩展方法,那我们只能自己来写一个扩展。
这里不得不感谢微软提供了扩展方法这么好的方式,有了它,一切就变的简单了,先前看到有个朋友问是不是项目该升级到Framework3.5,我觉得是非常有必要的,因为有了它,代码看上去是如此的优美。
因为也是刚尝试接触MVC,看了一下它的源代码,HtmlHelper的扩展方法都在 System.Web.Mvc.Html 命名空间内,大概看了下InputExtensions的代码,大致是根据传入的类型,传入的name生成一个input控件,很简单的方法,但提供了我们很大的便利。不过这里值得注意的是,如果你的TextBox(name)中有"."的话,你的控件id会把"."替换成"_"的。
说干就干,不是很难,其实就是解析一个表达式树,取出它属性的Name就Ok了。介绍Lambda表达式树的文章很多,这里就不作介绍了。
public static string GetMemeberName<T>(this Expression<T> expression)
{
MemberExpression memberExpression = null;
if (expression.Body.NodeType == ExpressionType.Convert)
{
var body = (UnaryExpression)expression.Body;
memberExpression = body.Operand as MemberExpression;
}
else if (expression.Body.NodeType == ExpressionType.MemberAccess)
{
memberExpression = expression.Body as MemberExpression;
}
else
{
throw new ArgumentException("expression Argument is Error");
}
return memberExpression.Member.Name;
}
这里的MemberName就是获取这个表达式树的,有了它我们就能实现原先的设想了:
public static string TextBox<T>(this HtmlHelper helper, Expression<Func<T, object>> expression)
{
return helper.TextBox<T>(expression, null);
}
public static string TextBox<T>(this HtmlHelper helper, Expression<Func<T, object>> expression, object value)
{
return helper.TextBox<T>(expression, value, null);
}
public static string TextBox<T>(this HtmlHelper helper, Expression<Func<T, object>> expression, object value, object htmlAttributes)
{
return helper.TextBox(expression.GetMemeberName(), value, htmlAttributes);
}
ok,我们可以使用以下方式来构造一个TextBox了:
<table>
<tr>
<td colspan="2">User Login</td>
</tr>
<tr>
<td>User Name:</td>
<td><%= Html.TextBox<StudyMvcApplication.Models.User>(u => u.Name) %></td>
</tr>
<tr>
<td>Password</td>
<td><%= Html.TextBox<StudyMvcApplication.Models.User>(u => u.Password) %></td>
</tr>
</table>
感觉看上去舒服多了,哈哈,看看效果图:
总结
现在还没有继续测试下去,实在有点忙,或许有人说有点多余,个人喜欢吧,哈哈。不过HtmlHelper还有很多扩展方法,所以还需要写很多代码,俺会一点一点去添加的。
说实在,MVC好像很多地方要使用那种硬编码,实在不爽,所以要改造一个自己适合的环境还真不容易啊。老赵最近弄了个MVCPath,要不就一起放进去?吼吼
- HTML 教程
- HTML 简介
- html div 标签介绍
- html span 标签介绍
- html a 超链接标签
- HTML Br换行标签介绍
- HTML P段落标签介绍
- HTML br与p标签区别
- Html H 标题标签
- html px em pt长度单位
- HTML form 标签
- HTML radio 单选框
- HTML B 加粗标签
- HTML strong加粗粗体标签
- HTML em 强调标签
- HTML i 斜体标签
- HTML u下划线标签
- HTML s 删除线标签
- Html img 图片标签
- Html上标注sup与下标注sub标签
- HTML nobr 禁止换行标签
- HTML hr 水平线标签
- HTML label 标签
- HTML input 标签
- HTML textarea 标签
- HTML select下拉列表标签
- HTML checkbox 多选框
- HTML font color 标签
- HTML iframe 框架标签
- HTML Table 表格
- HTML dl dt dd 标签
- HTML ol li有序列表标签
- HTML ul li 无序列表标签
- HTML 注释
- CSS 教程
- CSS 简介
- CSS 语法
- CSS Id 和 Class选择器
- CSS 样式的创建
- CSS background 背景介绍
- CSS 文本样式
- CSS font 字体
- CSS A 链接
- CSS ul ol列表样式
- CSS TABLE 样式
- CSS 框模型
- CSS border 边框
- CSS Outlines 轮廓
- CSS 外边距 Margin
- CSS Padding 内边距
- CSS 分组和嵌套选择器
- CSS 尺寸 (Dimension)
- CSS Display 属性
- CSS Position 定位
- CSS Float 浮动
- CSS 水平对齐(Horizontal Align)
- CSS 组合选择符
- CSS 伪类
- CSS 伪元素
- CSS 导航栏
- CSS 下拉菜单
- CSS 图片廊
- CSS 图像透明/不透明
- CSS sprite 图像拼合技术
- CSS 媒体类型
- CSS 属性选择器
- CSS 实例
- 在Linux中使用tcpdump命令捕获与分析数据包详解
- easyswoole一键安装脚本及宝塔安装错误问题
- CentOS7系统增加swap的操作方法实例
- iOS逆向之OpenSSH登录iPhone
- linux中SUID,SGID与SBIT的奇妙用途详解
- 详解Linux文件操作知识点
- Linux中nohup与&的用法和区别详解
- Linux中有效地管理进程的8个命令
- Centos7 下安装python3及卸载的教程
- Linux使用VIM编辑器的方法
- Centos安装MYSQL8.X的教程
- Linux使用join -a1来合并两个文件
- ZFS是什么?使用ZFS的理由及特性介绍
- centos7.x 部署主、从DNS服务器问题
- Linux查看History记录加时间戳的小技巧