升级到Abp 7.0后脚本问题的临时解决方案
Posted 上将军
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了升级到Abp 7.0后脚本问题的临时解决方案相关的知识,希望对你有一定的参考价值。
本解决方案以基本主题(Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic
)作为示例。
原因
升级到7.0后,因为本地化和授权策略的一些调整,造成返回的配置脚本存在问题,而相应的获取abp本地化资源以及获取权限的脚本并未做修改造成的。
具体情况是在新的本地化资源存放位置为abp.localization.resources
,而不是abp.localization.values
里,从而造成获取本地化资源失败的错误:
WARN: Could not find localization source: AbpUi
新的授权策略只存在abp.auth.grantedPolicies
中,原来的abp.auth.policies
中不再有授权策略。
具体有关本地化和授权策略的调整,可以查看这篇问题:ABP Version 7.0 Migration Guide。
解决方案
要完全解决脚本问题,需要修改获取本地化和策略的配置服务,我觉得比较麻烦,还是在客户端解决比较方便,于是有了本解决方案。
本解决方案的要点就是在获取到配置脚本后,通过修正脚本的方式来实现对本地化资源和权限的正确访问。获取配置脚本的script
标记都是在主题的布局页实现的,因而我们需要做的就是重写这些布局页。
在Web
项目的根目录新建Themes\\Basic\\Layouts
文件夹,然后把Basic
主题中的三个布局页Account.cshtml
、Application.cshtml
和Empty.cshtml
复制到刚创建的目录中。在这三个页面中,会看到以下加载配置脚本的代码:
<script src="~/Abp/ApplicationLocalizationScript?cultureName=@CultureInfo.CurrentCulture.Name"></script>
<script src="~/Abp/ApplicationConfigurationScript"></script>
<script src="~/Abp/ServiceProxyScript"></script>
要解决问题,我们需要在最后一句script
标记下加入以下代码:
<script src="~/global.js"></script>
也就是说,我们需要加入一个global.js
来修正脚本。要注意的是,该代码在以上三个布局页中都要加入。
接着在wwwroot
文件夹创建一个名为global.js
的文件,并加入以下代码:
(function ($)
abp.auth.isGranted = function (policyName)
return abp.auth.grantedPolicies[policyName] != undefined;
abp.localization.localize = function (key, sourceName)
if (sourceName === '_')
//A convention to suppress the localization
return key;
sourceName = sourceName || abp.localization.defaultResourceName;
if (!sourceName)
abp.log.warn('Localization source name is not specified and the defaultResourceName was not defined!');
return key;
var source = abp.localization.resources[sourceName];
if (!source)
abp.log.warn('Could not find localization source: ' + sourceName);
return key;
var value = source.texts[key];
if (value == undefined)
return key;
var copiedArguments = Array.prototype.slice.call(arguments, 0);
copiedArguments.splice(1, 1);
copiedArguments[0] = value;
return abp.utils.formatString.apply(this, copiedArguments);
)(jQuery);
以上代码首先更改是abp.auth.isGranted
函数,主要是把原函数中的abp.auth.policies[policyName] != undefined &&
删除了。如果不想更改abp.auth.isGranted
函数,也可以把abp.auth.grantedPolicies
的值赋值给abp.auth.policies
也可以。
而对于获取本地化资源就不能简单的把abp.localization.resources
的值赋值给abp.localization.values
,因为具体的资源值还需要从资源的texts
中获取,因而只能通过修改abp.localization.localize
函数来实现。而函数中主要修改的地方也是这两处,一是把获取资源的代码修改为从resources
获取资源,而获取值的代码修改为从资源的texts
中获取值。
通过以上的修改,就可临时解决本地化的问题和用户和角色的不能操作的问题了。
具体的代码修改,可参考https://github.com/tianxiaode/GenericAbp中的代码。
以上是关于升级到Abp 7.0后脚本问题的临时解决方案的主要内容,如果未能解决你的问题,请参考以下文章
ABP Framework 手动升级指南:从6.0.1升级到7.0.0