在父页面中呈现子页面

时间:2014-11-05 08:49:26

标签: c1-cms

是否可以在剃刀功能中呈现特定页面。我试过@RenderPage,但我无法弄清楚路径。是否有内置功能来实现这一目标?

谢谢约翰

1 个答案:

答案 0 :(得分:0)

不是特定于C1的方法,但我个人最好的方法就是为相关页面单独创建一个Web请求,解析html并进行渲染。

这段代码可以作为一个例子,它是我所使用的1:1。正如您所看到的,诀窍是找到包装内容的元素,在我的示例中,其内部元素的id等于 ContentColumnInner

public static string GetContentFromPage(Guid pageId)
{
    var DomainName = HttpContext.Current.Request.Url.Authority;
    var Uri = String.Format("http://{0}/page({1})", DomainName, pageId);
    var request = WebRequest.Create(Uri);

    // If required by the server, set the credentials.
    request.Credentials = CredentialCache.DefaultCredentials;

    // Get the response.
    using (var response = (HttpWebResponse)request.GetResponseWithoutException())
    {
        if (response.StatusCode != HttpStatusCode.OK)
        {
            LogError("StatusCode: " + response.StatusCode);
            return null;
        }

        // Get the stream containing content returned by the server.
        using (var responseStream = response.GetResponseStream())
        {
            if (responseStream == null)
            {
                LogError("ResponseStream is null");
                return null;
            }

            // Open the stream using a StreamReader for easy access.
            using (var stream = new StreamReader(responseStream))
            {
                // Read the content.
                var responseFromServer = stream.ReadToEnd();
                var beforeBodyStartIndex = responseFromServer.IndexOf("<body", StringComparison.Ordinal);
                var afterBodyEndIndex = responseFromServer.LastIndexOf("</body>", StringComparison.Ordinal) + 7;
                var body = responseFromServer.Substring(beforeBodyStartIndex, afterBodyEndIndex - beforeBodyStartIndex);

                try
                {
                    var xmlDocument = XElement.Parse(body);

                    var content = xmlDocument.Descendants().FirstOrDefault(o => o.Attribute("id") != null && o.Attribute("id").Value.EndsWith("ContentColumnInner"));

                    if (content == null || !content.HasElements)
                    {
                        return null;
                    }

                    var reader = content.CreateReader();
                    reader.MoveToContent();

                    return reader.ReadInnerXml();
                }
                catch (XmlException ex)
                {
                    LogError("Error parsing xml: " + ex.Message);
                    return null;
                }
            }
        }
    }
}