流畅地HtmlHelper-Asp.Net MVC

简介: 今天抛开 Fluent NHibernate 不谈,我们来谈谈 Asp.Net MVC ,在MVC的View中,我们经常会使用HtmlHelper来生成各种html代码(可能描述不太清楚看代码吧,呵呵)。

今天抛开 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>

感觉看上去舒服多了,哈哈,看看效果图:

image

总结

现在还没有继续测试下去,实在有点忙,或许有人说有点多余,个人喜欢吧,哈哈。不过HtmlHelper还有很多扩展方法,所以还需要写很多代码,俺会一点一点去添加的。

说实在,MVC好像很多地方要使用那种硬编码,实在不爽,所以要改造一个自己适合的环境还真不容易啊。老赵最近弄了个MVCPath,要不就一起放进去?吼吼

本文章演示代码下载

相关文章
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
38 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
53 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
46 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
3月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
118 0
|
6月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
78 0
|
6月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
|
2月前
|
XML 前端开发 JavaScript
Html:CSS介绍
Html:CSS介绍
48 1
|
2月前
|
前端开发
Html:CSS的书写位置
Html:CSS的书写位置
34 0
|
2天前
|
移动开发 前端开发 JavaScript
[HTML、CSS]细节与使用经验
本文总结了前端开发中的一些重要细节和技巧,包括CSS选择器、定位、层级、全局属性、滚轮控制、轮播等。作者以纯文字形式记录,便于读者使用<kbd>Ctrl + F</kbd>快速查找相关内容。文章还提供了示例代码,帮助读者更好地理解和应用这些知识点。
17 1
[HTML、CSS]细节与使用经验