升级到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.cshtmlApplication.cshtmlEmpty.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 7.0后脚本问题的临时解决方案

ABP Framework 手动升级指南:从6.0.1升级到7.0.0

ABP Framework 7.0 RC 新增功能简介

DZ论坛升级到7.2后上传附件问题

转载黑苹果USB一键定制脚本:可临时修复升级11.3系统版本后USB失效问题

abp(net core)+easyui+efcore实现仓储管理系统——供应商管理升级之上(六十三)