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程序員來講,這是很是實用的。