爱上MVC3系列~使用Func<string, HelperResult>实现访问权限的设计

回到目录

这个文章事实上也是一个系列,主要介绍小微对于MVC3上的权限设计方案,如对Action的访问权限,对PartialView的访问权限,和我最近研究的

对页面中Html块级访问权限!

一 提供好的~Action与Controller加访问权限

二 扩展MVC中的Html.Action,为分部视图作访问权限

三 扩展MVC的HtmlHelper,为页面某块HTML块(闭合的块)加访问权限

一 提供好的~Action与Controller加访问权限

直接将特性加到controller或者action上,即可,对于这部分详细内容可以看这篇文章

1          [RoleFilter(RoleFlag.WorkShopUser)]
2         public JsonResult TalkDetail(FormCollection form)
3         {
4         }

二 扩展MVC中的Html.Action,为分部视图作访问权限

对于,为Html.Action加权限其实就是把原来的方法进行重载几个,然后加入权限判断依据,就可以了,比较简单,但比较实用,在项目开发中

感觉不太灵活,但对于要为公用的分部视图而言,已经足够了。(应该分部视图A页面是一种访问权限,而在B页面是另一种访问权限,所以不能直接加到Action上幼)

 1  /// <summary>
 2         /// 带权限的分部视图
 3         /// </summary>
 4         /// <param name="htmlHelper"></param>
 5         /// <param name="actionName"></param>
 6         /// <param name="controllerName"></param>
 7         /// <param name="routeValues"></param>
 8         /// <param name="roleFlag"></param>
 9         /// <returns></returns>
10         public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, string controllerName, object routeValues, RoleFlag roleFlag)
11         {
12             #region 权限判断,如果不符合,就返回null
13            //权限验证代码片断...
14             #endregion
15             return ChildActionExtensions.Action(htmlHelper, actionName, controllerName, routeValues);
16         }
17         /// <summary>
18         /// 带权限的分部视图
19         /// </summary>
20         /// <param name="htmlHelper"></param>
21         /// <param name="actionName"></param>
22         /// <param name="roleFlag"></param>
23         /// <returns></returns>
24         public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, RoleFlag roleFlag)
25         {
26             return Action(htmlHelper, actionName, null, null, roleFlag);
27         }
28         /// <summary>
29         /// 带权限的分部视图
30         /// </summary>
31         /// <param name="htmlHelper"></param>
32         /// <param name="actionName"></param>
33         /// <param name="routeValues"></param>
34         /// <param name="roleFlag"></param>
35         /// <returns></returns>
36         public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, object routeValues, RoleFlag roleFlag)
37         {
38             return Action(htmlHelper, actionName, null, routeValues, roleFlag);
39         }

 

三 扩展MVC的HtmlHelper,为页面某块HTML块(闭合的块)加访问权限

对于这种方式是我最喜欢的也是最亲爱的方式,因为它的灵活性确实很高,再配合Razor引擎,可以说在代码的艺术性上是一个升华,呵呵

看看他在页面上的体现吧:

1 @Html.ServerTime(UserRole.GetHashCode(),
2 @<div>
3     <span>ok牛了</span><input type="button" value="不会吧" />
4 </div>)

而它的核心代码为:

 1        #region 页面代码块级权限设计
 2         /// <summary>
 3         /// 页面代码块级权限设计
 4         /// </summary>
 5         /// <param name="htmlHelper"></param>
 6         /// <param name="role">角色ID</param>
 7         /// <param name="template"></param>
 8         /// <returns></returns>
 9         public static HelperResult RoleHtmlTags(this HtmlHelper htmlHelper, int role, Func<string, HelperResult> template)
10         {
11             if (role != 1)
12                 return null;
13             return new HelperResult(writer =>
14             {
15                 writer.Write(template.Invoke(null));
16             });
17         }
18         #endregion

调用时的代码,注意我们使用它输入参数使用<div>或者<span>等标记括起来

@Html.RoleHtmlTags(1,
@<div>
<p>我的Html代码</p>
</div>)

感谢您的阅读!

喜欢代码艺术性的跟我一起研究吧,呵呵 !

 回到目录

posted @ 2012-12-13 10:58  张占岭  阅读(2741)  评论(4编辑  收藏  举报