自定义ASP.NET MVC Html辅助方法
在ASP.NET
MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明。有时候,我们不想重复地写一些HTML代码,或者MS没有提供我们想要的那个HTML标签的Html辅助方法,那么,我们就可以通过自己定义一个Html扩展方法来达到这个目的。
  比如,到目前为止,Html扩展方法中没有关于<input
type="file" />这类标签的辅助方法,那么我们就可以自已实现一个。本文以实现<input type="file"
/>标签为例,演示如何实现自定义Html扩展方法。
  一、实现自定义弱类型Html扩展方法
  其实实现自定义Html扩展方法并不难,有兴趣的同学可以去看下MVC源代码,关于Html扩展方法部分。要用到System.Web.Mvc命名空间下的TagBuilder类,MvcHtmlString类。TagBuilder类为Html辅助方法生成HTML标签,MvcHtmlString代表HTML编码的字符串。扩展方法代码如下所示:

 public static class MyInputExtensions
{
public static MvcHtmlString Input(this HtmlHelper htmlHelper, string name)
{
TagBuilder tagBuilder = new TagBuilder("input");//设置标签类型为input
tagBuilder.Attributes.Add("type", "file");//为标签添加type属性及值
tagBuilder.Attributes.Add("name", name);//为标签添加name属性及值
 tagBuilder.GenerateId(name);//为标签生成Id,name参数代码Id的值
//创建经过HTML加密的字符串
//TagRenderMode.SelfClosing枚举值代表当前标签是自动关闭的
return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.SelfClosing));
}
}

需要特别提醒的是,扩展方法类所在的命名空间最好设置为System.Web.Mvc,这样,我们在View中可以通过智能感知轻易找到,也不容易出错或者无法通过VS智能感知找到我们自定义的Html辅助方法,可以为我们省去很多不必要的麻烦。将上面代码编译,我们即可在View中通过智能感知看到我们自定义的Html辅助方法。如下图所示:

使用方法和其它Html辅助方法一样,如下代码所示:
<%: Html.Input("Path")
%>
//字符串参数Path代表生成标签的name属性和id属性的值
 需要说明的是,本例所示是为了生成<input
type="file">标签,是不用设置值的,读者可以通过自身情况定义扩展方法。然后运行,通过浏览器查看HTML源代码,如下图所示:

二、实现自定义强类型Html辅助方法
  强类型辅助方法的一个好处是,我们可以通过编译器为我们检测一些错误,为我们节省一些排错的时间与精力。所以,强类型Html辅助方法是不可缺少的。代码如下:
 代码
 public
static class MyInputExtensions
 {
     public static MvcHtmlString
Input<TModel, TValue>(this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TValue>> expression)
     {
        
string modelName =
ExpressionHelper.GetExpressionText(expression);//从Lambda表达式中获取模型对应属性的名称
         
TagBuilder tagBuilder = new TagBuilder("input");//设置标签类型为input
        
tagBuilder.Attributes.Add("type", "file");//为标签添加type属性及值
         
tagBuilder.Attributes.Add("name", modelName);//为标签添加name属性及值
         
tagBuilder.GenerateId(modelName);//为标签生成Id,name参数代码Id的值
         
//创建经过HTML加密的字符串
         
//TagRenderMode.SelfClosing枚举值代表当前标签是自动关闭的
         return
MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.SelfClosing));
    
}
 }
然后我们编译,在View中,我们就可以通过智能感知看到我们新扩展的强类型Html辅助方法了。如下图所示:
我们可以通过如下代码使用新扩展的Html辅助方法:
<%:
Html.Input(model => model.Path)
%>
//Path代表model的Path属性,生成标签的name和id的属性值均会是Path
  运行,我们通过浏览器查看生成的Html源代码如下图所示:
三、为标签错误输入添加CSS支持
  对于要求输入的标签,如Text,如果用户输入错误内容,我们可以为当前标签添加CSS错误提示,为用户提供一个更加友好、人性化的界面。代码如下所示:
 代码
ModelState
modelState;
if (htmlHelper.ViewData.ModelState.TryGetValue(name, out
modelState))
{
    if (modelState.Errors.Count > 0)
    {
       
//添加错误提示CSS
        
tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
    
}
 }
将以上代码复制到我们自定义的扩展方法的返回MvcHtmlString字符串之前即可。
 四、总结
  本文通过演示如果实现自定义<input
type="file" />标签的Html辅助方法,展示了如何在ASP.NET MVC中实现自定义Html辅助方法。对于ASP.NET
MVC程序员来说,这是非常实用的。

自定义MVC Html的更多相关文章

  1. 自定义MVC框架

    我们在学习自定义MVC框架的时候常常会听到Model1 ,Model2和MVC.那么什么是Model1 什么是Model2什么又是MVC呢? 什么是Model1? Model1就是一种纯jsp开发技术 ...

  2. Struts2 自定义MVC框架

    一.Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形 ...

  3. struts2自定义MVC框架

    自定义MVC:(首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是 ...

  4. 如何自定义MVC控件?

    今天公司要写学习总结,想着想着还是先写一篇关于MVC内部什么东东的博客整理整理再发表吧,一举两得. 之前写过了路由.过滤器等.今天就研究一下怎么自定义MVC控件吧. 本人技术小菜,不喜勿喷.....( ...

  5. 第一章 自定义MVC框架

    第一章  自定义MVC框架1.1 MVC模式设计    组成:Model:模型,用于数据和业务的处理          View :视图,用于数据的显示          Controller:控制器 ...

  6. ASP.NET Core中使用自定义MVC过滤器属性的依赖注入

    除了将自己的中间件添加到ASP.NET MVC Core应用程序管道之外,您还可以使用自定义MVC过滤器属性来控制响应,并有选择地将它们应用于整个控制器或控制器操作. ASP.NET Core中常用的 ...

  7. 自定义MVC框架之工具类-模型类

    截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理 ...

  8. 自定义MVC框架之工具类-图像处理类

    截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( ...

  9. 自定义MVC框架之工具类-文件上传类

    截止目前已经改造了3个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 该文件上传类功能如下: 1,允许定制上传的文件类型,文件mime信息,文 ...

  10. Java Web自定义MVC框架详解 (转)

    转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架 ...

随机推荐

  1. Testing Round #12 A

    A. Divisibility time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  2. IDEA打war包

    一 第一步创建一个web application:expolded 选择当前项目 二 新建一个web application: Archive 选择刚刚新建的Expoded  “For ‘...... ...

  3. FileInputstream的available()方法

    摘自:http://greemranqq.iteye.com/blog/2051487

  4. CodeForces 219C Color Stripe

    Color Stripe Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submi ...

  5. R: NULL, NA, and NaN

    NaN (“Not a Number”) means 0/0 NA (“Not Available”) is generally interpreted as a missing value and ...

  6. [HRBUST1472]Coin(dp,计数)

    题目链接:http://acm-software.hrbust.edu.cn/problem.php?id=1472 题意:给n个硬币,面值随意.问恰好凑成m元的种类数(去掉重复). dp(i,j,k ...

  7. [HDOJ3714]Error Curves(三分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3714 题意:求n个二次函数在[0,1000]的最小值. 三分枚举. #include <bits ...

  8. kaili 2.0 metasploit连接postgres数据库

    第一步:使用命令 db_init 初始化数据库

  9. SQL Server 小技巧【2】

    --1.不要使用×来查询所有字段 SELECT * FROM DBO.tb1 --改为 SELECT FName,PWD,CreateDate FROM DBO.tb1 (NOLOCK) --2.查询 ...

  10. FZU 2213 Common Tangents(公切线)

    Description 题目描述 Two different circles can have at most four common tangents. The picture below is a ...