在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 }
以上只是一点点扩展,余下得,需自行测试,生成更多。