在MVC中,我們不僅可以使用它原來的方法,我們還可以自定義,這不不僅加大了我們開發的效率,同時使界面更簡潔。 具體什麼是擴展方法,你可以這樣理解,必須是靜態且在形參中第一個參數是以this開頭,大概先這樣理解下哈。接下來,我們就可以實現了。 首先,我們定義一個名為HtmlExtensions的類,在
在MVC中,我們不僅可以使用它原來的方法,我們還可以自定義,這不不僅加大了我們開發的效率,同時使界面更簡潔。
具體什麼是擴展方法,你可以這樣理解,必須是靜態且在形參中第一個參數是以this開頭,大概先這樣理解下哈。接下來,我們就可以實現了。
首先,我們定義一個名為HtmlExtensions的類,在MVCWeb下。(如果你在別的類庫下,當前類庫必須引入兩個System.Web.WebPages和System.Web.Mvc,不然無法使用TagBuilder此類(自定義標簽啊等)若沒有找到此Dll,可以在web下的bin文件夾里找)
這裡為了方便,以防我每次引入命名空間,我把此類下的命名空間改為 System.Web.Mvc.Html
MvcHtmlString.Create()此方法類似於@Html.Raw();
MvcHtmlString.Create()只能解析字元串,而@Html.Raw()能解析任何對象。
代碼如下:
1 using System.Linq.Expressions; 2 using System.Web.Mvc; 3 using System.Web.WebPages.Html; 4 namespace System.Web.Mvc.Html 5 { 6 //HtmlHelper Extensions 7 public static class HtmlExtensions 8 { 9 #region DisplayDescription + static MvcHtmlString DisplayDescription(this HtmlHelper htmlHelper, string name)
//在這裡,我們傳入一個字元串進去,返回解析後的html文本,在頁面我們可以這樣使用 @Html.DisplayDescription("請輸入用戶名") 10 /// <summary> 11 /// DisplayDescription 12 /// </summary> 13 /// <param name="htmlHelper">HtmlHelper</param> 14 /// <param name="name">name</param> 15 /// <returns></returns> 16 public static MvcHtmlString DisplayDescription(this HtmlHelper htmlHelper, string name) 17 { 18 ModelMetadata modelMetadata = ModelMetadata.FromStringExpression(name, htmlHelper.ViewData); 19 return MvcHtmlString.Create(modelMetadata.Description); 20 21 } 22 #endregion 23 24 #region DisplayDescriptionFor + static MvcHtmlString DisplayDescriptionFor<TModel, TResult>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TResult>> expression) 25 //在這裡,我們Lambda進去,返回解析後的html文本,在頁面我們可以這樣使用 @Html.DisplayDescriptionFor(model=>model.屬性名)
/// <summary> 26 /// DisplayDescriptionFor 27 /// </summary> 28 /// <typeparam name="TModel">Model</typeparam> 29 /// <typeparam name="TResult">Result</typeparam> 30 /// <param name="htmlHelper">Htmlper</param> 31 /// <param name="expression">lanmda</param> 32 /// <returns></returns> 33 public static MvcHtmlString DisplayDescriptionFor<TModel, TResult>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TResult>> expression) 34 { //註意FromLambdaExpression這裡跟上面是不一樣的,這裡是通過lambda來創建的 35 ModelMetadata modelMetadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 36 return MvcHtmlString.Create(modelMetadata.Description); 37 } 38 #endregion 39 40 #region Submit +static MvcHtmlString DisplaySubmit(this HtmlHelper helper, string value)
////在這裡,我們Lambda進去,返回解析後的html標簽,在頁面我們可以這樣使用 @Html.Submit("提交") 41 /// <summary> 42 /// Submit 43 /// </summary> 44 /// <param name="helper">Htmlper</param> 45 /// <param name="value">Input Value</param> 46 /// <returns></returns> 47 public static MvcHtmlString Submit(this HtmlHelper helper, string value) 48 { 49 var builder = new TagBuilder("input");//創建一個input標簽 50 builder.MergeAttribute("type", "submit");//創建其標簽屬性 51 builder.MergeAttribute("value", value);//創建其標簽屬性 52 builder.ToString(TagRenderMode.SelfClosing);//TagRenderMode.SelfClosing標識生成自閉合的標簽,例如 <br /> 53 return MvcHtmlString.Create(builder.ToString());//builder.ToString()相當於輸出,MvcHtmlString.Create()解析 54 } 55 #endregion 56 57 } 58 }
以上只是一點點擴展,餘下得,需自行測試,生成更多。