如何从具有相对引用内容的单独文件夹中呈现静态HTML

本文关键字:文件夹 单独 HTML 静态 相对 引用 | 更新日期: 2023-09-27 18:06:41

我正在开发一个自定义CMS。我在Azure blobs中存储了每个研究文章的内容。内容包括一个index.html文件和任何相关的图像,pdf等。index.html页面使用相对的本地引用,如:

<img src="chuck-norris-1.jpg" />

这样我们的设计人员就可以制作相关内容的文章,并将其全部放在一个文件夹中发送到Azure blob容器。然后,每个web服务器将内容下载到本地researchcharle内容文件夹结构中,如下所示:

ResearchArticleBodyLocal'abc

所以,现在我必须在有人查看文章时显示此内容。我正在将index.html读取为字符串并使用@Html.raw()。问题是,从视图来看,相对引用不起作用因为视图显然与内容在不同的位置。

但是#1相对引用是关闭的,#2由于某种原因它运行了两次动作方法,好像它有jQuery问题,但我这里没有使用任何jQuery…

这是我正在尝试的:

控制器方法——

ravm.ArticleBodyIndexHtmlPath = System.IO.File.ReadAllText(Server.MapPath(ConfigurationManager.AppSettings["ResearchArticleBodyRelativeLocalDirectory"] + researchArticle.BodyRelativeLocalPath + "/index.html"));

视图——

@(Html.Raw(Model.ArticleBodyIndexHtmlPath))

我也尝试过这个解决方案,但相对参考的事情仍然是一个问题…有人知道如何解决这个问题,而不需要设计人员将预期的目录结构放入内容引用中吗?

如何从具有相对引用内容的单独文件夹中呈现静态HTML

你也许可以把目录结构在那里使用一点字符串替换/正则表达式?我在我自己的模板系统中这样做,这样设计师就可以做src="chuck-norris.jpg",我根据被击中的网站自动替换为src="/othersite-image-dir/chuck-norris.jpg"。这样我的设计师就不用记住目录了。

另一种方法是为你的对象设置一个特定的目录结构,即

图片

js

css

这样,设计师就可以点击src="/js/my-chuck-norris.js",无论文件在哪个网站

是的,我最后这样做了:

 private List<string> GetFilePathsAndUpdateIndexHtml(string bodyFolderChoices, string containerName)
    {
        // get path to each item
        var filePaths =
            Directory.GetFiles(
                Server.MapPath(ConfigurationManager.AppSettings["ResearchArticleFTPUploadRoot"] + "/" +
                               bodyFolderChoices));
        // get root from web.config
        var azureRootUrl = ConfigurationManager.AppSettings["AzureBlobRootUrl"] + containerName + "/";
        // find index.html and replace relative references
        foreach (var s in filePaths)
        {
            if (s.Contains("index.html"))
            {
                var doc = new HtmlDocument();
                doc.LoadHtml(System.IO.File.ReadAllText(s));
                HtmlNodeCollection links = doc.DocumentNode.SelectNodes("//*[@background or @lowsrc or @src or @href]");
                if (links == null)
                    continue;
                foreach (HtmlNode link in links)
                {
                    // references to outside URLs this will break unless we check for 'http' and leave alone
                    if (link.Attributes["background"] != null && !link.Attributes["background"].Value.Contains("http"))
                        link.Attributes["background"].Value = azureRootUrl + link.Attributes["background"].Value;
                    if (link.Attributes["href"] != null && !link.Attributes["href"].Value.Contains("http"))
                        link.Attributes["href"].Value = azureRootUrl + link.Attributes["href"].Value;
                    if (link.Attributes["lowsrc"] != null && !link.Attributes["lowsrc"].Value.Contains("http"))
                        link.Attributes["lowsrc"].Value = azureRootUrl + link.Attributes["lowsrc"].Value;
                    if (link.Attributes["src"] != null && !link.Attributes["src"].Value.Contains("http"))
                        link.Attributes["src"].Value = azureRootUrl + link.Attributes["src"].Value;
                }
                doc.Save(s);
            }
        }
        return filePaths.ToList();
    }