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>
这只是一种引用外部文件的方案,也可以引用其他类型文件用于其他用途。