项目使用MVC+ExtJs实现,权限控制是基于Controller下的ActionResult的,有一个页面因参数不同就需要新建两个ActionResult。
不要问我为何是基于页面级,而不是数据级,我只想说这是历史遗留问题。
现在直面我们的问题,两个ActionResult也就是两个页面,共用同一个Js文件,而这个文件又是ExtJs的,众所周知,ExtJs获取Dom是通过Ext.getCmp('‘)来获取,那么,原来唯一的页面Id现在就变的不唯一了,会出现事件调用混乱。
昨天曾想了几年解决办法。
方法1:获取页面路径+Id后缀,生成唯一ID.
实践,此路不通。
代码如下:var url = window.location.href;
获取结果,获取的是ExtJs的框架页路径,而不是当前面路径。
方法2:页面加载时,自动生成类Guid的Id+Id后缀,生成唯一ID。
未作实践,理论上是可行的。
方法3:使用Js后缀传参,如:LogisticsMgr/MatRequireView.aspx.js?MatType=111
我们就获取这个111,然后再+各控件Id后缀,生成唯一ID.
方法实现:
Ext.namespace("JsHelper"); //获得js文件后面的参数 如test.js?user=wuf created by wufei 2013-10-25 JsHelper.GetJsParamValue = function(param) { var rName = new RegExp("(\\?(.*))?$") var jss = document.getElementsByTagName('script'); for (var i = 0; i < jss.length; i++) { var j = jss[i]; if (j.src && j.src.match(rName)) { var oo = j.src.match(rName)[2]; if (oo && (t = oo.match(/([^&=]+)=([^=&]+)/g))) { for (var l = 0; l < t.length; l++) { r = t[l]; var tt = r.match(/([^&=]+)=([^=&]+)/); if (tt && tt[1] == param) return tt[2]; } } } } return ''; }
方法调用:var idPre = JsHelper.GetJsParamValue("MatType");
至此问题解决,声明ID和获取ID是都加上这个变量就可以了。
备注:此方案无效,因为Js只加载一次,所以后打开的页面获取的参数不正确。
希望高人指点解决方案。