动态加载窗体权限控制问题

morliz子轩 自由职业 ERP程序员  2021-05-03 05:09:32

//有以下几个对象:
//1、业务窗体
public partial class FrmBranch : BaseDock
{
private PermissionsController Permissions { get; set; }
public FrmBranch()
{
InitializeComponent();
Permissions = new PermissionsController(this); //权限控制类

//根据权限屏蔽功能对象
InitAutothorizedUI();
}
}

//2、权限类
public class PermissionsController
{
private BaseDock Basedock { get; set; }
private BaseForm Baseform { get; set; }

/// <summary>
/// 功能模块名称
/// </summary>
public string Itemno { get; set; }

public PermissionsController(BaseDock frm)
{
Basedock = frm;
GetItemno();
}

public PermissionsController(BaseForm frm)
{
Baseform = frm;
GetItemno();
}

/// <summary>
/// 检查用户功能级权限
/// </summary>
/// <param name="itemno"></param>
public bool CheckUserFuncAuth()
{
//是否具备功能模块权限
bool IsAuthorization = false;

//判断查询权限
if (Basedock != null)
if (!Basedock.GetLiminf(Portal.gc.UserInfo.Logno, Itemno, "aaaa"))
{
IsAuthorization = true;
MessageDxUtil.ShowWarning("当前账户【" + Portal.gc.UserInfo.Logno + "】没有查询权限,请联系系统管理员!");
}

if (Baseform != null)
if (!Baseform.GetLiminf(Portal.gc.UserInfo.Logno, Itemno, "brow"))
{
IsAuthorization = true;
throw new ArgumentException("当前账户【" + Portal.gc.UserInfo.Logno + "】没有查询权限,请联系系统管理员!");
}

return IsAuthorization;
}

/// <summary>
/// 获取当前类模块名称
/// </summary>
/// <returns></returns>
private void GetItemno()
{
if (Basedock != null)
Itemno = BusinessHelper.GetRemovePrefixString(Basedock.Name, "Frm");

if (Baseform != null)
Itemno = BusinessHelper.GetRemovePrefixString(Baseform.Name, "Frm");
}

}



由于窗体是动态实例化加载的,当CheckUserFuncAuth()方法,为True时,终止FrmBranch窗体的实体化,这个要怎么控制实现,请教大神。
...全文
171 点赞 收藏 4
写回复
4 条回复
morliz子轩 05月05日
引用 2 楼 xuzuning 的回复:
new PermissionsController(this); 你自然可以在PermissionsController 中对 传入的 FrmBranch 实例做任何操作,包括销毁
我已经想到了解决办法,实际上不在本窗体内去做权限控制,在动态反射实例化时,就能处理。感谢大佬的回复
回复 点赞
morliz子轩 05月05日
引用 1 楼 wanghui0380 的回复:
终止?终止不了。 你想结束 xxx xx=new xxx();这是反逻辑的,所以你能做的只能是 throw一个异常出来,这样这个new就直接异常了。当然这是反逻辑,反模式操作 正向逻辑,正向模式操作如下(我以netcore以后的Ihost通用主机系统作为例子,因为我不想总纠结于过去20年的那些东西,而你们未来也必定会接触他,比如maui)
我已经想到了别的处理逻辑,在动态反射实例化时,把这个判断控制放上去,就可以。开始只想到在窗体上实现,有点钻进了死胡同。 感谢你的回复,不过你后面写的高论,我是只懂了点皮毛。见笑
回复 点赞
xuzuning 05月03日
new PermissionsController(this); 你自然可以在PermissionsController 中对 传入的 FrmBranch 实例做任何操作,包括销毁
回复 点赞
wanghui0380 05月03日
终止?终止不了。 你想结束 xxx xx=new xxx();这是反逻辑的,所以你能做的只能是 throw一个异常出来,这样这个new就直接异常了。当然这是反逻辑,反模式操作 正向逻辑,正向模式操作如下(我以netcore以后的Ihost通用主机系统作为例子,因为我不想总纠结于过去20年的那些东西,而你们未来也必定会接触他,比如maui) 从netcore开始说,用户登录以后是一个sope生存期。而你的窗体也必定依赖这个用户上下文。所以他最终设计成 class 用户上下文 { Isope sope; 用户上下文(iserviceprovdier provider) public void 登录() { sope provider.newsope() } public list<业务窗体> 业务窗体=>{ retrn 业务窗体.getService<I业务窗体>().where (p=>p(this)) } //当前用户上下文具备权限的窗体 } Service.Add<I业务窗体,窗体1>()//注册所有窗体 service.AddSocpe<用户上下文> service.AddSocpe<list<业务窗体>>(p=>p.用户上下文.业务窗体) //根据用户上下文过滤业务窗体 纯手写设计,只代表未来在通用主机Ihost这种模式下怎么设计系统的思路(不代表你可以直接敲到vs里),俺们稍微放远点这样才能适合未来不被抹杀(从现在就应该接触并理解他们,不要过几年被新人们直接给挤出了)------------很明显在这种通用主机ihost模式下,你会更清楚自己在干嘛,你会容易在正确的地方写正确的结构,所以他具备未来的普适性也更容易被未来的新人接受(当然不肯接受的老人们只能离开了)
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告