1

我正在使用来自 ServiceStack 的 Razor/Markdown 引擎,并且在将我自己的自定义模板/布局应用于一些渲染的 Markdown 时遇到了一些困难。Markdown 内容呈现完美,我只想将其注入到我选择的模板/布局文件中。

目前我有这个(效果很好):

var rootPath = HttpContext.Current.Server.MapPath("~/");
var markdownPath = Path.Combile(rootPath, "NotFound.md");
var format = new MarkdownFormat();
var markdownContent = File.ReadAllText(markdownPath);
const string pageTitle = "Not Found";
var page = new MarkdownPage(format, rootPath, pageTitle, markdownContent);
format.AddPage(page);
var scopeArgs = new Dictionary<string, object>();
var html = format.RenderDynamicPageHtml(pageTitle, scopeArgs);

现在我有一个我希望使用的布局文件位于“~/ErrorLayout.cshtml”,但是我不知道如何注入它。起初我想将 MarkdownPage 上的 Template 变量设置为我的布局文件的路径,但这不起作用。然后我尝试调用 format.AddLayout() ,不幸的是引发了异常。

任何帮助将不胜感激,如果我没有明确我想要做的事情,请随时要求我自己进一步澄清。

4

1 回答 1

0

所以我已经解决了这个问题,但是我不确定我所做的是否是正确的方法,但是它可以工作并且没有抛出异常。如果我做错了,也许有更多知识的人可以纠正我(所以我会在接受我的答案之前让这个问题开放几天)。

我创建了一个实现 IVirtualPathProvider 接口的新类,并将其命名为 PathProvider

我还创建了一个实现 IVirtualFile 接口的类,并将其命名为 VirtualFile

然后,我将 MarkdownFormat 实例中的 VirtualPathProvider 设置为 PathProvider 的新实例。然后,我将我的 Markdownpage 实例上的 Template 变量设置为我想要使用的 cshtml 布局/模板文件的相对路径,并且在我之前提到的两个类中,在请求时返回此模板的相关内容这样做。

我的代码现在看起来像这样(以防其他人和我有同样的问题):

var rootPath = HttpContext.Current.Server.MapPath("~/");
if (contents == null)
{
    var notFoundPath = Path.Combine(rootPath, "NotFound.md");
    contents = File.ReadAllText(notFoundPath);
}
var format = new MarkdownFormat
{
    VirtualPathProvider = new PathProvider()
};
const string pageTitle = "Not Found";
var page = new MarkdownPage(format, rootPath, pageTitle, contents)
{
    Template = "~/_Layout.cshtml"
};
 format.AddPage(page);
var view = new Dictionary<string, object>();
var html = format.RenderDynamicPageHtml(pageTitle, view);

我的 PathProvider 类如下所示:

public class PathProvider : IVirtualPathProvider
{
    public IVirtualDirectory RootDirectory { get; private set; }
    public string VirtualPathSeparator { get; private set; }
    public string RealPathSeparator { get; private set; }
    public string CombineVirtualPath(string basePath, string relativePath)
    {
        throw new NotImplementedException();
    }

    public bool FileExists(string virtualPath)
    {
        throw new NotImplementedException();
    }

    public bool DirectoryExists(string virtualPath)
    {
        throw new NotImplementedException();
    }

    public IVirtualFile GetFile(string virtualPath)
    {
        return new VirtualFile(this, virtualPath);
    }

    public string GetFileHash(string virtualPath)
    {
        throw new NotImplementedException();
    }

    public string GetFileHash(IVirtualFile virtualFile)
    {
        throw new NotImplementedException();
    }

    public IVirtualDirectory GetDirectory(string virtualPath)
    {
        throw new NotImplementedException();
    }

    public IEnumerable<IVirtualFile> GetAllMatchingFiles(string globPattern, int maxDepth = 2147483647)
    {
        throw new NotImplementedException();
    }

    public bool IsSharedFile(IVirtualFile virtualFile)
    {
        throw new NotImplementedException();
    }

    public bool IsViewFile(IVirtualFile virtualFile)
    {
        throw new NotImplementedException();
    }
}

最后是我的 VirtualFile 类:

public class VirtualFile : IVirtualFile
{
    public IVirtualDirectory Directory { get; private set; }
    public string Name { get; private set; }
    public string VirtualPath { get; private set; }
    public string RealPath { get; private set; }
    public bool IsDirectory { get; private set; }
    public DateTime LastModified { get; private set; }
    public IVirtualPathProvider VirtualPathProvider { get; private set; }
    public string Extension { get; private set; }

    public VirtualFile(IVirtualPathProvider virtualPathProvider, string filePath)
    {
        VirtualPathProvider = virtualPathProvider;
        VirtualPath = filePath;
        RealPath = HttpContext.Current.Server.MapPath(filePath);
    }

    public string GetFileHash()
    {
        throw new NotImplementedException();
    }

    public Stream OpenRead()
    {
        throw new NotImplementedException();
    }

    public StreamReader OpenText()
    {
        throw new NotImplementedException();
    }

    public string ReadAllText()
    {
        return File.ReadAllText(RealPath);
    }
}
于 2012-12-17T19:40:54.087 回答