https://www.cnblogs.com/myshell/archive/2010/05/09/1731269.htmlhtml
在ASP.NET MVC中,Html辅助方法给咱们程序员带来不少方便,其重要性也就不言自明。有时候,咱们不想重复地写一些HTML代码,或者MS没有提供咱们想要的那个HTML标签的Html辅助方法,那么,咱们就能够经过本身定义一个Html扩展方法来达到这个目的。程序员
好比,到目前为止,Html扩展方法中没有关于<input type="file" />这类标签的辅助方法,那么咱们就能够自已实现一个。本文以实现<input type="file" />标签为例,演示如何实现自定义Html扩展方法。shell
1、实现自定义弱类型Html扩展方法express
其实实现自定义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辅助方法。以下图所示:ui

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

2、实现自定义强类型Html辅助方法加密
强类型辅助方法的一个好处是,咱们能够经过编译器为咱们检测一些错误,为咱们节省一些排错的时间与精力。因此,强类型Html辅助方法是不可缺乏的。代码以下:spa
代码
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源代码以下图所示:

3、为标签错误输入添加CSS支持
对于要求输入的标签,如Text,若是用户输入错误内容,咱们能够为当前标签添加CSS错误提示,为用户提供一个更加友好、人性化的界面。代码以下所示:
代码
ModelState modelState;
if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState))
{
if (modelState.Errors.Count > 0)
{
//添加错误提示CSS
tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
}
}
将以上代码复制到咱们自定义的扩展方法的返回MvcHtmlString字符串以前便可。
4、总结
本文经过演示若是实现自定义<input type="file" />标签的Html辅助方法,展现了如何在ASP.NET MVC中实现自定义Html辅助方法。对于ASP.NET MVC程序员来讲,这是很是实用的。