将页面渲染为自定义输出

时间:2011-01-31 14:06:38

标签: asp.net templates rendering

让我们来看一个通常的aspx页面,〜/ admin / template.aspx

admin文件夹仅允许“管理员”角色。

现在我不想像往常一样运行template.aspx,但我想从活动进程中调用它。 假设我在〜/ admin / buildMyStuff.aspx上,我收集了一些数据,我现在有一些查询字符串,比如“?do = this $ andDo = that $ index = {0}”。现在我希望,使用这个模板,循环我的数据并生成我的输出,然后将其放在例如静态html或文本文件或其他内容中。

我该怎么做? 将其称为新请求,等待响应?我必须做什么,它是在“管理员”角色下运行,还是自动执行,因为我已经是管理员?

还是有另一种可能性,允许我运行模板页面并指定我的自定义htmltextwriter作为输出?

修改

public static string RenderPageAndGetHtml(string pageUrl, string pageQuery)
    {
        var sw = new StringWriter();
        var wr = new SimpleWorkerRequest(pageUrl, pageQuery, sw);
        HttpRuntime.ProcessRequest(wr);
        sw.Close();
        return sw.ToString();
    }

这是解决方案。

BUT:

似乎SimpleWorkerRequest出现了错误

发生以下情况:

〜/ default.aspx失败

/default.aspx失败

default.aspx确定

en / default.aspx失败

/en/default.aspx失败

〜/ en / default.aspx失败

编辑:

好的,我实现了我的自定义HttpWorkerRequest。现在它有效......

由于

3 个答案:

答案 0 :(得分:1)

您需要template.aspx页面的HTML代码吗?尝试这个功能,也许这就是你需要的:

public static string RenderPageAndGetHtml(string pageUrl, string pageQuery)
    {
        var sw = new StringWriter();
        var wr = new SimpleWorkerRequest(pageUrl, pageQuery, sw);
        HttpRuntime.ProcessRequest(wr);
        sw.Close();
        return sw.ToString();
    }

答案 1 :(得分:1)

需要注意的是,SimpleWorkerRequest不会将网址作为输入而是路径......我浪费了几个小时,这基本上意味着en/default.aspx将转化为

  • page:zh
  • pathInfo:default.aspx

你需要在路径中使用反斜杠

en\default.aspx

答案 2 :(得分:0)

好的,我找到了UTF8WorkerRequest,但它只用于将SimpleWorkerRequest设置为UTF8编码(它是UTF16内部)。遗憾!

public class UTF8WorkerRequest : SimpleWorkerRequest 
{

    private TextWriter theWriter;

    public UTF8WorkerRequest(string page, string query, TextWriter output) : base(page, query, output)
    {
        theWriter = output;
    }

    public UTF8WorkerRequest(string appVirtualDir, string appPhysicalDir, string page, string query, TextWriter output) : base(appVirtualDir, appPhysicalDir, page, query, output)
    {
        theWriter = output;
    }

    public override void SendResponseFromMemory(byte[] data, int length)
    {

        theWriter.Write(System.Text.Encoding.UTF8.GetString(data));

    }
}