mvc扩展HtmlHelper功能

HtmlHelper详细介绍

 

简单示例

 

自定义HtmlHelper

 

解决:

  直接写HTML的话如果语句有语法错误,如缺少结尾标记</b>,编译器不会报错,出来的页面可能会很乱且难以查出错误在哪。如果用HtmlHelper在编译的时候就会指出错误,可以及时修改

  View中的页面一般都是动态页面,也就是说如果没有HtmlHelper,我们经常会写如<input type="text" value="@id">这样的服务器端代码和HTML代码的混合代码。这样写不仅形式混乱、执行顺序不好判断,而且出错也不容易发现,不如全部用HtmlHelper写成服务器端代码。而且用HtmlHelper做数据绑定更方便。

  HtmlHelper和HTML语言的关系,我觉得跟Linq和SQL语言的关系差不多。就是说微软给你提供了一种方式让你在不熟悉HTML或SQL这种非.NET语言的时候,使用.NET框架内的与之等价的类来帮助你更好的解决问题。

 

 

自定义HtmlHelperExtensions

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
namespace DVM.WebSite.Common
{
    /// <summary>
    /// URL访问检查器
    /// </summary>
    public class UrlAccessChecker
    {
        /// <summary>
        /// 检查当前用户是否具备访问特定Action权限
        /// </summary>
        /// <param name="actionName">Action名字</param>
        /// <param name="controllerName">Controller名字</param>
        /// <returns>具备访问权限返回True,否则返回False</returns>
        public static Boolean HasAccess(String actionName, String controllerName)
        {
            //.........
            return false;
        }
    }
 
    public static class HtmlHelperExtensions
    {
        public static MvcHtmlString DictDropDownListFor<TModel,TValue>(this HtmlHelper<TModel> htmlHelper, String category, Expression<Func<TModel, TValue>> expression, string optionLabel=null, object htmlAttributes=null) where TModel:class
        {
            var dict = SystemDictionaryCache.Instance.GetNodesByRoot(category);
            var value = expression.Compile()(htmlHelper.ViewData.Model);
            var selectList = new SelectList(dict, "Key", "Value", value);
            return htmlHelper.DropDownListFor(expression, selectList, optionLabel, htmlAttributes);
        }
 
        public static MvcHtmlString DictSubDropDownListFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, String category,int pvalue,Expression<Func<TModel, TValue>> expression, string optionLabel = null, object htmlAttributes = null) where TModel : class
        {
            var dict = pvalue<=0?new Dictionary<string, string>():SystemDictionaryCache.Instance.GetSubNodes(category,pvalue);
            var value = expression.Compile()(htmlHelper.ViewData.Model);
            var selectList = new SelectList(dict, "Key", "Value", value);
            return htmlHelper.DropDownListFor(expression, selectList, optionLabel, htmlAttributes);
        }
 
        /// <summary>
        /// 生成对象的Json字符串
        /// </summary>
        /// <param name="helper">helper</param>
        /// <param name="o">目标对象</param>
        /// <returns>Html字符串</returns>
        public static MvcHtmlString MvcJson(this HtmlHelper helper, object o)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
 
            StringBuilder builder = new StringBuilder();
            serializer.Serialize(
                o, builder);
            return new MvcHtmlString(builder.ToString());
        }
 
        /// <summary>
        /// 创建指定的a元素,如果用户没有权限访问,则返回空串
        /// </summary>
        /// <param name="htmlHelper">htmlHelper</param>
        /// <param name="linkText">链接文本</param>
        /// <param name="actionName">Action名称</param>
        /// <returns>HTML内容</returns>
        public static MvcHtmlString ActionLinkACL(
            this HtmlHelper htmlHelper,
            string linkText,
            string actionName
        )
        {
            var result = new MvcHtmlString(String.Empty);
            var controllerName = htmlHelper.ViewContext.RouteData.Values["Controller"].ToString();
            if (UrlAccessChecker.HasAccess(actionName, controllerName))
            {
                return htmlHelper.ActionLink(linkText, actionName, controllerName);
            }
            return result;
        }
 
        /// <summary>
        /// 创建指定的a元素,如果用户没有权限访问,则返回空串
        /// </summary>
        /// <param name="htmlHelper">htmlHelper</param>
        /// <param name="linkText">链接文本</param>
        /// <param name="actionName">Action名称</param>
        /// <param name="routeValues">路由参数</param>
        /// <returns>Html内容</returns>
        public static MvcHtmlString ActionLinkACL(
            this HtmlHelper htmlHelper,
            string linkText,
            string actionName,
            Object routeValues
        )
        {
            var result = new MvcHtmlString(String.Empty);
            var controllerName = htmlHelper.ViewContext.RouteData.Values["Controller"].ToString();
            if (UrlAccessChecker.HasAccess(actionName, controllerName))
            {
                return htmlHelper.ActionLink(linkText, actionName, controllerName, routeValues);
            }
            return result;
        }
 
        
 
        /// <summary>
        /// 创建AjaxLink,默认Update对象为#wrap
        /// 默认替代模式为replace,默认请求方式为Get
        /// </summary>
        /// <param name="htmlHelper">htmlHelper</param>
        /// <param name="linkText">链接文本</param>
        /// <param name="controllerName">Area和Controller名称,含area则使用/链接</param>
        /// <param name="htmlAttributes">html属性列表</param>
        /// <param name="innerHtml">内部Html</param>
        /// <returns>Html内容</returns>
        public static MvcHtmlString AjaxLink2ACL(
           this HtmlHelper htmlHelper,
           string linkText,
           string actionName,
           string controllerName,
           IDictionary<string, Object> htmlAttributes,
           string innerHtml,
           string method = "GET"
           )
        {
            TagBuilder tb = new TagBuilder("a");
 
            var defaultAttributes = new Dictionary<String, Object>
                {
                    { "data-ajax-update","#wrap" },
                    { "data-ajax-mode","replace" },
                    { "data-ajax-method","GET" },
                    { "data-ajax-complete","closeWaitingDialog" },
                    { "data-ajax-begin","waitingDialog" },
                    { "data-ajax-success","onRequestSuccess" },
                    { "data-ajax-failure","onRequestFailed" },
                    { "data-ajax","true" },
                };
 
            if (!String.IsNullOrEmpty(method))
            {
                defaultAttributes["data-ajax-method"] = method;
            }
 
            if (htmlAttributes != null)
            {
                foreach (var kp in htmlAttributes)
                {
                    defaultAttributes[kp.Key] = kp.Value;
                }
            }
            foreach (var attr in defaultAttributes)
            {
                tb.MergeAttribute(attr.Key, Convert.ToString(attr.Value));
            }
            var linkUrl = String.Format("{0}/{1}/{2}",HttpRuntime.AppDomainAppVirtualPath,controllerName,actionName);
            linkUrl = linkUrl.Replace("//", "/");
            tb.MergeAttribute("href", linkUrl);
            tb.InnerHtml = innerHtml+linkText;
            return new MvcHtmlString(tb.ToString(TagRenderMode.Normal));
        }
    }
}

  

 

前台页面调用:

1
@using DVM.WebSite.Common;

  

1
2
3
4
5
6
<li>
       <div>
           @Html.AjaxLink2ACL(subMenu.Name, subMenu.ActionName, String.IsNullOrEmpty(subMenu.AreaName) ? subMenu.ControllerName : subMenu.AreaName + "/" + subMenu.ControllerName,new Dictionary < String, Object >{{ "class","" }}, "")</div>
       @*<div> @Url.Action(subMenu.ControllerName, subMenu.ActionName)</div>
       <div>@Ajax.RouteLink(subMenu.Name, new { controller = String.IsNullOrEmpty(subMenu.AreaName) ? subMenu.ControllerName : subMenu.AreaName + "/" + subMenu.ControllerName, action = subMenu.ActionName }, ajaxOptions)</div>*@
   </li>           

  

 

posted @   PanPan003  阅读(307)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示