lds
发布于 2025-05-01 / 4 阅读
0

cshtml (razor,普通的应该也可以)引用同名文件或扩展文件

cshtml 普通类型的需要明确生成类的父类替换函数中的this RazorPageBase page

实现方法是把引用的外部资源有规律的嵌入到程序集中

开发时(#if DEBUG)通过本地文件实时编辑,正式环境调用嵌入资源

代码

引用的文件需要配置成嵌入的资源


        /// <summary>
        /// 引用文件
        /// </summary>
        /// <param name="page">cshtml生成类</param>
        /// <param name="extension">不带.的扩展名</param>
        /// <param name="result">最终结果(文本或默认javascript提示)</param>
        /// <param name="extName">文件扩展名如Index.cb.xx cb是扩展名</param>
        /// <returns></returns>
        public static bool file(this RazorPageBase page,string extension,out string result, string? extName = null)
        {
#if DEBUG // 从文件读取 调试时实时内容
            var fileName = $"{page.Path}{(extName.IsNullOrEmpty() ? string.Empty : $".{extName}")}.{extension}".Replace("/", "\\");
            var basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..", "..", "..");
            fileName = basePath + fileName;
            if (File.Exists(fileName)) result = File.ReadAllText(fileName);
            else
            {
                result = $"文件不存在:{fileName}";
                return false;
            }
#else  // 从嵌入资源读取
            if(page .ViewContext.ActionDescriptor is ControllerActionDescriptor descriptor)
            {
                var type = descriptor.ControllerTypeInfo;
                if(type == null)
                {
                    result = $"{extension} 无法获取程序集";
                    return false;
                }
                var fileName = descriptor.DisplayName;
                fileName = fileName?.Substring(0, fileName.IndexOf(".Areas"));
                if(fileName != null) fileName = $"{fileName}{page.Path.Replace("/", ".")}{(extName.IsNullOrEmpty() ? string.Empty : $".{ extName}")}.{extension}";
                if (fileName == null)
                {
                    result = $"{extension} 未找到嵌入";
                    return false;
                }
                using (var sm = type.Assembly.GetManifestResourceStream(fileName))
                {
                    if (sm != null)
                    {
                        using (var sr = new StreamReader(sm))
                        {
                            result = sr.ReadToEnd();
                            sr.Close();
                        }
                        sm.Close();
                    }
                    else
                    {
                        result = $"{extension} 无嵌入资源";
                        return false;
                    }
                }
            }
            else
            {
                result = $"{extension} 无法转换";
                return false;
            }
#endif
            if (result.IsNullOrEmpty())
            {
                result = $"{extension} 无内容";
                return false;
            }
            return true;
        }

        /// <summary>
        /// 获取视图同名css文件内容
        /// </summary>
        /// <param name="page">cshtml生成类(cshtml文件里引用)</param>
        /// <param name="extName">扩展名</param>
        /// <returns></returns>
        public static IHtmlContent css(this RazorPageBase page,string? extName = null)
        {
            var res = file(page, "css",out var result, extName);
            var hcb = new HtmlContentBuilder();
            if (res)
            {
                hcb.AppendHtml($@"
<style type=""text/css"">
{result}
</style>");
            }
            else
            {
                hcb.AppendHtml(@$"<script type=""text/javascript"">
console.log(""{result}"");
</script>");
            }
            return hcb;
        }
        /// <summary>
        /// 获取同名js内容
        /// </summary>
        /// <param name="page">cshtml生成类</param>
        /// <param name="extName">扩展名</param>
        /// <param name="args">传递参数</param>
        /// <returns></returns>
        public static IHtmlContent js(this RazorPageBase page, string? extName = null,object? args = null)
        {
            var res = file(page, "js", out var result, extName);
            var hcb = new HtmlContentBuilder();
            if (res)
            {
                hcb.AppendHtml($@"
<script type=""text/javascript"">
var args = {JsonConvert.SerializeObject(args)}
{result}
</script>");
            }
            else
            {
                hcb.AppendHtml(@$"<script type=""text/javascript"">
console.log(""{result}"");
</script>");
            }
            return hcb;
        }

使用

cshtml中

@{
...
}
@this.css()
@this.js(args:new { url:... })

js中

var url = args.url;

最终访问的页面是把js内容嵌入到html中的<script></script>里,css<style></style>

这只是一种引用外部文件的方案,也可以引用其他类型文件用于其他用途。